Merge commit 'v3.14' into next
This commit is contained in:
@@ -233,6 +233,14 @@ static int inode_alloc_security(struct inode *inode)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void inode_free_rcu(struct rcu_head *head)
|
||||
{
|
||||
struct inode_security_struct *isec;
|
||||
|
||||
isec = container_of(head, struct inode_security_struct, rcu);
|
||||
kmem_cache_free(sel_inode_cache, isec);
|
||||
}
|
||||
|
||||
static void inode_free_security(struct inode *inode)
|
||||
{
|
||||
struct inode_security_struct *isec = inode->i_security;
|
||||
@@ -243,8 +251,16 @@ static void inode_free_security(struct inode *inode)
|
||||
list_del_init(&isec->list);
|
||||
spin_unlock(&sbsec->isec_lock);
|
||||
|
||||
inode->i_security = NULL;
|
||||
kmem_cache_free(sel_inode_cache, isec);
|
||||
/*
|
||||
* The inode may still be referenced in a path walk and
|
||||
* a call to selinux_inode_permission() can be made
|
||||
* after inode_free_security() is called. Ideally, the VFS
|
||||
* wouldn't do this, but fixing that is a much harder
|
||||
* job. For now, simply free the i_security via RCU, and
|
||||
* leave the current inode->i_security pointer intact.
|
||||
* The inode will be freed after the RCU grace period too.
|
||||
*/
|
||||
call_rcu(&isec->rcu, inode_free_rcu);
|
||||
}
|
||||
|
||||
static int file_alloc_security(struct file *file)
|
||||
@@ -652,7 +668,7 @@ static int selinux_set_mnt_opts(struct super_block *sb,
|
||||
if (flags[i] == SBLABEL_MNT)
|
||||
continue;
|
||||
rc = security_context_to_sid(mount_options[i],
|
||||
strlen(mount_options[i]), &sid);
|
||||
strlen(mount_options[i]), &sid, GFP_KERNEL);
|
||||
if (rc) {
|
||||
printk(KERN_WARNING "SELinux: security_context_to_sid"
|
||||
"(%s) failed for (dev %s, type %s) errno=%d\n",
|
||||
@@ -2491,7 +2507,8 @@ static int selinux_sb_remount(struct super_block *sb, void *data)
|
||||
if (flags[i] == SBLABEL_MNT)
|
||||
continue;
|
||||
len = strlen(mount_options[i]);
|
||||
rc = security_context_to_sid(mount_options[i], len, &sid);
|
||||
rc = security_context_to_sid(mount_options[i], len, &sid,
|
||||
GFP_KERNEL);
|
||||
if (rc) {
|
||||
printk(KERN_WARNING "SELinux: security_context_to_sid"
|
||||
"(%s) failed for (dev %s, type %s) errno=%d\n",
|
||||
@@ -2895,7 +2912,7 @@ static int selinux_inode_setxattr(struct dentry *dentry, const char *name,
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
rc = security_context_to_sid(value, size, &newsid);
|
||||
rc = security_context_to_sid(value, size, &newsid, GFP_KERNEL);
|
||||
if (rc == -EINVAL) {
|
||||
if (!capable(CAP_MAC_ADMIN)) {
|
||||
struct audit_buffer *ab;
|
||||
@@ -3052,7 +3069,7 @@ static int selinux_inode_setsecurity(struct inode *inode, const char *name,
|
||||
if (!value || !size)
|
||||
return -EACCES;
|
||||
|
||||
rc = security_context_to_sid((void *)value, size, &newsid);
|
||||
rc = security_context_to_sid((void *)value, size, &newsid, GFP_KERNEL);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
@@ -5527,7 +5544,7 @@ static int selinux_setprocattr(struct task_struct *p,
|
||||
str[size-1] = 0;
|
||||
size--;
|
||||
}
|
||||
error = security_context_to_sid(value, size, &sid);
|
||||
error = security_context_to_sid(value, size, &sid, GFP_KERNEL);
|
||||
if (error == -EINVAL && !strcmp(name, "fscreate")) {
|
||||
if (!capable(CAP_MAC_ADMIN)) {
|
||||
struct audit_buffer *ab;
|
||||
@@ -5636,7 +5653,7 @@ static int selinux_secid_to_secctx(u32 secid, char **secdata, u32 *seclen)
|
||||
|
||||
static int selinux_secctx_to_secid(const char *secdata, u32 seclen, u32 *secid)
|
||||
{
|
||||
return security_context_to_sid(secdata, seclen, secid);
|
||||
return security_context_to_sid(secdata, seclen, secid, GFP_KERNEL);
|
||||
}
|
||||
|
||||
static void selinux_release_secctx(char *secdata, u32 seclen)
|
||||
|
Reference in New Issue
Block a user