aboutsummaryrefslogtreecommitdiffstats
path: root/security
diff options
context:
space:
mode:
authorEric Paris <eparis@redhat.com>2011-04-28 15:11:21 -0400
committerEric Paris <eparis@redhat.com>2011-04-28 15:15:54 -0400
commit562abf624175e3f8487b7f064e516805e437e597 (patch)
tree75e52d8f8f91fc42c28ca2e0b7196b9fd16c25e0 /security
parent2463c26d50adc282d19317013ba0ff473823ca47 (diff)
SELinux: pass last path component in may_create
New inodes are created in a two stage process. We first will compute the label on a new inode in security_inode_create() and check if the operation is allowed. We will then actually re-compute that same label and apply it in security_inode_init_security(). The change to do new label calculations based in part on the last component of the path name only passed the path component information all the way down the security_inode_init_security hook. Down the security_inode_create hook the path information did not make it past may_create. Thus the two calculations came up differently and the permissions check might not actually be against the label that is created. Pass and use the same information in both places to harmonize the calculations and checks. Reported-by: Dominick Grift <domg472@gmail.com> Signed-off-by: Eric Paris <eparis@redhat.com>
Diffstat (limited to 'security')
-rw-r--r--security/selinux/hooks.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index 9e8078a42a94..a6dd2bed8d7b 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -1579,7 +1579,8 @@ static int may_create(struct inode *dir,
1579 return rc; 1579 return rc;
1580 1580
1581 if (!newsid || !(sbsec->flags & SE_SBLABELSUPP)) { 1581 if (!newsid || !(sbsec->flags & SE_SBLABELSUPP)) {
1582 rc = security_transition_sid(sid, dsec->sid, tclass, NULL, &newsid); 1582 rc = security_transition_sid(sid, dsec->sid, tclass,
1583 &dentry->d_name, &newsid);
1583 if (rc) 1584 if (rc)
1584 return rc; 1585 return rc;
1585 } 1586 }