diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2010-03-20 22:32:26 -0400 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2010-05-21 18:31:13 -0400 |
commit | decabd6650915a9534dad09e967115513be12b24 (patch) | |
tree | 3e4aa8ed78535f3a34b60e363e7b13efbd7ea62c /fs/ecryptfs/main.c | |
parent | 894680710d813137077ad7cb351b713f64cabbdf (diff) | |
download | linux-stable-decabd6650915a9534dad09e967115513be12b24.tar.gz linux-stable-decabd6650915a9534dad09e967115513be12b24.tar.bz2 linux-stable-decabd6650915a9534dad09e967115513be12b24.zip |
fix a couple of ecryptfs leaks
First of all, get_sb_nodev() grabs anon dev minor and we
never free it in ecryptfs ->kill_sb(). Moreover, on one
of the failure exits in ecryptfs_get_sb() we leak things -
it happens before we set ->s_root and ->put_super() won't
be called in that case. Solution: kill ->put_super(), do
all that stuff in ->kill_sb(). And use kill_anon_sb() instead
of generic_shutdown_super() to deal with anon dev leak.
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/ecryptfs/main.c')
-rw-r--r-- | fs/ecryptfs/main.c | 9 |
1 files changed, 7 insertions, 2 deletions
diff --git a/fs/ecryptfs/main.c b/fs/ecryptfs/main.c index 760983d0f25e..36268db29ea1 100644 --- a/fs/ecryptfs/main.c +++ b/fs/ecryptfs/main.c @@ -633,11 +633,16 @@ out: * @sb: The ecryptfs super block * * Used to bring the superblock down and free the private data. - * Private data is free'd in ecryptfs_put_super() */ static void ecryptfs_kill_block_super(struct super_block *sb) { - generic_shutdown_super(sb); + struct ecryptfs_sb_info *sb_info = ecryptfs_superblock_to_private(sb); + kill_anon_super(sb); + if (!sb_info) + return; + ecryptfs_destroy_mount_crypt_stat(&sb_info->mount_crypt_stat); + bdi_destroy(&sb_info->bdi); + kmem_cache_free(ecryptfs_sb_info_cache, sb_info); } static struct file_system_type ecryptfs_fs_type = { |