Skip to content

Commit 52ca4b6

Browse files
robertosassupcmoore
authored andcommitted
reiserfs: Switch to security_inode_init_security()
In preparation for removing security_old_inode_init_security(), switch to security_inode_init_security(). Commit 572302a ("reiserfs: Add missing calls to reiserfs_security_free()") fixed possible memory leaks and another issue related to adding an xattr at inode creation time. Define the initxattrs callback reiserfs_initxattrs(), to populate the name/value/len triple in the reiserfs_security_handle() with the first xattr provided by LSMs. Make a copy of the xattr value, as security_inode_init_security() frees it. After the call to security_inode_init_security(), remove the check for returning -EOPNOTSUPP, as security_inode_init_security() changes it to zero. Multiple xattrs are currently not supported, as the reiserfs_security_handle structure is exported to user space. As a consequence, even if EVM is invoked, it will not provide an xattr (if it is not the first to set it, its xattr will be discarded; if it is the first, it does not have xattrs to calculate the HMAC on). Signed-off-by: Roberto Sassu <roberto.sassu@huawei.com> Reviewed-by: Casey Schaufler <casey@schaufler-ca.com> Reviewed-by: Mimi Zohar <zohar@linux.ibm.com> Signed-off-by: Paul Moore <paul@paul-moore.com>
1 parent b9b8701 commit 52ca4b6

1 file changed

Lines changed: 18 additions & 5 deletions

File tree

fs/reiserfs/xattr_security.c

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,22 @@ static bool security_list(struct dentry *dentry)
3939
return !IS_PRIVATE(d_inode(dentry));
4040
}
4141

42+
static int
43+
reiserfs_initxattrs(struct inode *inode, const struct xattr *xattr_array,
44+
void *fs_info)
45+
{
46+
struct reiserfs_security_handle *sec = fs_info;
47+
48+
sec->value = kmemdup(xattr_array->value, xattr_array->value_len,
49+
GFP_KERNEL);
50+
if (!sec->value)
51+
return -ENOMEM;
52+
53+
sec->name = xattr_array->name;
54+
sec->length = xattr_array->value_len;
55+
return 0;
56+
}
57+
4258
/* Initializes the security context for a new inode and returns the number
4359
* of blocks needed for the transaction. If successful, reiserfs_security
4460
* must be released using reiserfs_security_free when the caller is done. */
@@ -56,12 +72,9 @@ int reiserfs_security_init(struct inode *dir, struct inode *inode,
5672
if (IS_PRIVATE(dir))
5773
return 0;
5874

59-
error = security_old_inode_init_security(inode, dir, qstr, &sec->name,
60-
&sec->value, &sec->length);
75+
error = security_inode_init_security(inode, dir, qstr,
76+
&reiserfs_initxattrs, sec);
6177
if (error) {
62-
if (error == -EOPNOTSUPP)
63-
error = 0;
64-
6578
sec->name = NULL;
6679
sec->value = NULL;
6780
sec->length = 0;

0 commit comments

Comments
 (0)