Skip to content

Commit eb95e7f

Browse files
Michael HalcrowLinus Torvalds
authored andcommitted
[PATCH] eCryptfs: Reduce stack usage in ecryptfs_generate_key_packet_set()
eCryptfs is gobbling a lot of stack in ecryptfs_generate_key_packet_set() because it allocates a temporary memory-hungry ecryptfs_key_record struct. This patch introduces a new kmem_cache for that struct and converts ecryptfs_generate_key_packet_set() to use it. Signed-off-by: Michael Halcrow <mhalcrow@us.ibm.com> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
1 parent 29dbb3f commit eb95e7f

3 files changed

Lines changed: 24 additions & 8 deletions

File tree

‎fs/ecryptfs/ecryptfs_kernel.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -467,6 +467,7 @@ extern struct kmem_cache *ecryptfs_header_cache_1;
467467
extern struct kmem_cache *ecryptfs_header_cache_2;
468468
extern struct kmem_cache *ecryptfs_xattr_cache;
469469
extern struct kmem_cache *ecryptfs_lower_page_cache;
470+
extern struct kmem_cache *ecryptfs_key_record_cache;
470471

471472
int ecryptfs_interpose(struct dentry *hidden_dentry,
472473
struct dentry *this_dentry, struct super_block *sb,

‎fs/ecryptfs/keystore.c‎

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1638,6 +1638,8 @@ write_tag_3_packet(char *dest, size_t max, struct ecryptfs_auth_tok *auth_tok,
16381638
return rc;
16391639
}
16401640

1641+
struct kmem_cache *ecryptfs_key_record_cache;
1642+
16411643
/**
16421644
* ecryptfs_generate_key_packet_set
16431645
* @dest: Virtual address from which to write the key record set
@@ -1664,50 +1666,55 @@ ecryptfs_generate_key_packet_set(char *dest_base,
16641666
&ecryptfs_superblock_to_private(
16651667
ecryptfs_dentry->d_sb)->mount_crypt_stat;
16661668
size_t written;
1667-
struct ecryptfs_key_record key_rec;
1669+
struct ecryptfs_key_record *key_rec;
16681670
int rc = 0;
16691671

16701672
(*len) = 0;
1673+
key_rec = kmem_cache_alloc(ecryptfs_key_record_cache, GFP_KERNEL);
1674+
if (!key_rec) {
1675+
rc = -ENOMEM;
1676+
goto out;
1677+
}
16711678
if (mount_crypt_stat->global_auth_tok) {
16721679
auth_tok = mount_crypt_stat->global_auth_tok;
16731680
if (auth_tok->token_type == ECRYPTFS_PASSWORD) {
16741681
rc = write_tag_3_packet((dest_base + (*len)),
16751682
max, auth_tok,
1676-
crypt_stat, &key_rec,
1683+
crypt_stat, key_rec,
16771684
&written);
16781685
if (rc) {
16791686
ecryptfs_printk(KERN_WARNING, "Error "
16801687
"writing tag 3 packet\n");
1681-
goto out;
1688+
goto out_free;
16821689
}
16831690
(*len) += written;
16841691
/* Write auth tok signature packet */
16851692
rc = write_tag_11_packet(
16861693
(dest_base + (*len)),
16871694
(max - (*len)),
1688-
key_rec.sig, ECRYPTFS_SIG_SIZE, &written);
1695+
key_rec->sig, ECRYPTFS_SIG_SIZE, &written);
16891696
if (rc) {
16901697
ecryptfs_printk(KERN_ERR, "Error writing "
16911698
"auth tok signature packet\n");
1692-
goto out;
1699+
goto out_free;
16931700
}
16941701
(*len) += written;
16951702
} else if (auth_tok->token_type == ECRYPTFS_PRIVATE_KEY) {
16961703
rc = write_tag_1_packet(dest_base + (*len),
16971704
max, auth_tok,
16981705
crypt_stat,mount_crypt_stat,
1699-
&key_rec, &written);
1706+
key_rec, &written);
17001707
if (rc) {
17011708
ecryptfs_printk(KERN_WARNING, "Error "
17021709
"writing tag 1 packet\n");
1703-
goto out;
1710+
goto out_free;
17041711
}
17051712
(*len) += written;
17061713
} else {
17071714
ecryptfs_printk(KERN_WARNING, "Unsupported "
17081715
"authentication token type\n");
17091716
rc = -EINVAL;
1710-
goto out;
1717+
goto out_free;
17111718
}
17121719
} else
17131720
BUG();
@@ -1717,6 +1724,9 @@ ecryptfs_generate_key_packet_set(char *dest_base,
17171724
ecryptfs_printk(KERN_ERR, "Error writing boundary byte\n");
17181725
rc = -EIO;
17191726
}
1727+
1728+
out_free:
1729+
kmem_cache_free(ecryptfs_key_record_cache, key_rec);
17201730
out:
17211731
if (rc)
17221732
(*len) = 0;

‎fs/ecryptfs/main.c‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -651,6 +651,11 @@ static struct ecryptfs_cache_info {
651651
.name = "ecryptfs_lower_page_cache",
652652
.size = PAGE_CACHE_SIZE,
653653
},
654+
{
655+
.cache = &ecryptfs_key_record_cache,
656+
.name = "ecryptfs_key_record_cache",
657+
.size = sizeof(struct ecryptfs_key_record),
658+
},
654659
};
655660

656661
static void ecryptfs_free_kmem_caches(void)

0 commit comments

Comments
 (0)