Commit 51b15e79 authored by Roberto Sassu's avatar Roberto Sassu Committed by Casey Schaufler

smack: Always determine inode labels in smack_inode_init_security()

The inode_init_security hook is already a good place to initialize the
in-memory inode. And that is also what SELinux does.

In preparation for this, move the existing smack_inode_init_security() code
outside the 'if (xattr)' condition, and set the xattr, if provided.

This change does not have any impact on the current code, since every time
security_inode_init_security() is called, the initxattr() callback is
passed and, thus, xattr is non-NULL.
Signed-off-by: default avatarRoberto Sassu <roberto.sassu@huawei.com>
Signed-off-by: default avatarCasey Schaufler <casey@schaufler-ca.com>
parent ac02f007
...@@ -1000,51 +1000,51 @@ static int smack_inode_init_security(struct inode *inode, struct inode *dir, ...@@ -1000,51 +1000,51 @@ static int smack_inode_init_security(struct inode *inode, struct inode *dir,
struct xattr *xattr = lsm_get_xattr_slot(xattrs, xattr_count); struct xattr *xattr = lsm_get_xattr_slot(xattrs, xattr_count);
int may; int may;
if (xattr) { /*
/* * If equal, transmuting already occurred in
* If equal, transmuting already occurred in * smack_dentry_create_files_as(). No need to check again.
* smack_dentry_create_files_as(). No need to check again. */
*/ if (tsp->smk_task != tsp->smk_transmuted) {
if (tsp->smk_task != tsp->smk_transmuted) { rcu_read_lock();
rcu_read_lock(); may = smk_access_entry(skp->smk_known, dsp->smk_known,
may = smk_access_entry(skp->smk_known, dsp->smk_known, &skp->smk_rules);
&skp->smk_rules); rcu_read_unlock();
rcu_read_unlock(); }
}
/*
* In addition to having smk_task equal to smk_transmuted,
* if the access rule allows transmutation and the directory
* requests transmutation then by all means transmute.
* Mark the inode as changed.
*/
if ((tsp->smk_task == tsp->smk_transmuted) ||
(may > 0 && ((may & MAY_TRANSMUTE) != 0) &&
smk_inode_transmutable(dir))) {
struct xattr *xattr_transmute;
/* /*
* In addition to having smk_task equal to smk_transmuted, * The caller of smack_dentry_create_files_as()
* if the access rule allows transmutation and the directory * should have overridden the current cred, so the
* requests transmutation then by all means transmute. * inode label was already set correctly in
* Mark the inode as changed. * smack_inode_alloc_security().
*/ */
if ((tsp->smk_task == tsp->smk_transmuted) || if (tsp->smk_task != tsp->smk_transmuted)
(may > 0 && ((may & MAY_TRANSMUTE) != 0) && isp = dsp;
smk_inode_transmutable(dir))) { xattr_transmute = lsm_get_xattr_slot(xattrs,
struct xattr *xattr_transmute; xattr_count);
if (xattr_transmute) {
xattr_transmute->value = kmemdup(TRANS_TRUE,
TRANS_TRUE_SIZE,
GFP_NOFS);
if (!xattr_transmute->value)
return -ENOMEM;
/* xattr_transmute->value_len = TRANS_TRUE_SIZE;
* The caller of smack_dentry_create_files_as() xattr_transmute->name = XATTR_SMACK_TRANSMUTE;
* should have overridden the current cred, so the
* inode label was already set correctly in
* smack_inode_alloc_security().
*/
if (tsp->smk_task != tsp->smk_transmuted)
isp = dsp;
xattr_transmute = lsm_get_xattr_slot(xattrs,
xattr_count);
if (xattr_transmute) {
xattr_transmute->value = kmemdup(TRANS_TRUE,
TRANS_TRUE_SIZE,
GFP_NOFS);
if (!xattr_transmute->value)
return -ENOMEM;
xattr_transmute->value_len = TRANS_TRUE_SIZE;
xattr_transmute->name = XATTR_SMACK_TRANSMUTE;
}
} }
}
if (xattr) {
xattr->value = kstrdup(isp->smk_known, GFP_NOFS); xattr->value = kstrdup(isp->smk_known, GFP_NOFS);
if (!xattr->value) if (!xattr->value)
return -ENOMEM; return -ENOMEM;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment