diff options
author | Santosh Nayak <santoshprasadnayak@gmail.com> | 2012-03-02 11:47:26 +0530 |
---|---|---|
committer | Steve French <sfrench@us.ibm.com> | 2012-03-06 21:46:53 -0600 |
commit | b0f8ef202ec7f07ba9bd93150d54ef4327851422 (patch) | |
tree | c5d7c9cfd330f2c950680b0c2febdf2c19431933 | |
parent | 55062d061790b43aee01ab3f9ac57b8596254f19 (diff) | |
download | op-kernel-dev-b0f8ef202ec7f07ba9bd93150d54ef4327851422.zip op-kernel-dev-b0f8ef202ec7f07ba9bd93150d54ef4327851422.tar.gz |
cifs: possible memory leak in xattr.
Memory is allocated irrespective of whether CIFS_ACL is configured
or not. But free is happenning only if CIFS_ACL is set. This is a
possible memory leak scenario.
Fix is:
Allocate and free memory only if CIFS_ACL is configured.
Signed-off-by: Santosh Nayak <santoshprasadnayak@gmail.com>
Reviewed-by: Shirish Pargaonkar <shirishpargaonkar@gmail.com>
Signed-off-by: Steve French <sfrench@us.ibm.com>
-rw-r--r-- | fs/cifs/xattr.c | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/fs/cifs/xattr.c b/fs/cifs/xattr.c index 45f07c4..10d92cf 100644 --- a/fs/cifs/xattr.c +++ b/fs/cifs/xattr.c @@ -105,7 +105,6 @@ int cifs_setxattr(struct dentry *direntry, const char *ea_name, struct cifs_tcon *pTcon; struct super_block *sb; char *full_path; - struct cifs_ntsd *pacl; if (direntry == NULL) return -EIO; @@ -164,23 +163,24 @@ int cifs_setxattr(struct dentry *direntry, const char *ea_name, cifs_sb->mnt_cifs_flags & CIFS_MOUNT_MAP_SPECIAL_CHR); } else if (strncmp(ea_name, CIFS_XATTR_CIFS_ACL, strlen(CIFS_XATTR_CIFS_ACL)) == 0) { +#ifdef CONFIG_CIFS_ACL + struct cifs_ntsd *pacl; pacl = kmalloc(value_size, GFP_KERNEL); if (!pacl) { cFYI(1, "%s: Can't allocate memory for ACL", __func__); rc = -ENOMEM; } else { -#ifdef CONFIG_CIFS_ACL memcpy(pacl, ea_value, value_size); rc = set_cifs_acl(pacl, value_size, direntry->d_inode, full_path, CIFS_ACL_DACL); if (rc == 0) /* force revalidate of the inode */ CIFS_I(direntry->d_inode)->time = 0; kfree(pacl); + } #else cFYI(1, "Set CIFS ACL not supported yet"); #endif /* CONFIG_CIFS_ACL */ - } } else { int temp; temp = strncmp(ea_name, POSIX_ACL_XATTR_ACCESS, |