aboutsummaryrefslogtreecommitdiffstats
path: root/security/selinux/hooks.c
diff options
context:
space:
mode:
authorDmitry Torokhov <dmitry.torokhov@gmail.com>2013-05-01 11:47:44 -0400
committerDmitry Torokhov <dmitry.torokhov@gmail.com>2013-05-01 11:47:44 -0400
commitbf61c8840efe60fd8f91446860b63338fb424158 (patch)
tree7a71832407a4f0d6346db773343f4c3ae2257b19 /security/selinux/hooks.c
parent5846115b30f3a881e542c8bfde59a699c1c13740 (diff)
parent0c6a61657da78098472fd0eb71cc01f2387fa1bb (diff)
Merge branch 'next' into for-linus
Prepare first set of updates for 3.10 merge window.
Diffstat (limited to 'security/selinux/hooks.c')
-rw-r--r--security/selinux/hooks.c69
1 files changed, 44 insertions, 25 deletions
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index 61a53367d029..2fa28c88900c 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -1528,7 +1528,7 @@ static int file_has_perm(const struct cred *cred,
1528 u32 av) 1528 u32 av)
1529{ 1529{
1530 struct file_security_struct *fsec = file->f_security; 1530 struct file_security_struct *fsec = file->f_security;
1531 struct inode *inode = file->f_path.dentry->d_inode; 1531 struct inode *inode = file_inode(file);
1532 struct common_audit_data ad; 1532 struct common_audit_data ad;
1533 u32 sid = cred_sid(cred); 1533 u32 sid = cred_sid(cred);
1534 int rc; 1534 int rc;
@@ -1957,7 +1957,7 @@ static int selinux_bprm_set_creds(struct linux_binprm *bprm)
1957 struct task_security_struct *new_tsec; 1957 struct task_security_struct *new_tsec;
1958 struct inode_security_struct *isec; 1958 struct inode_security_struct *isec;
1959 struct common_audit_data ad; 1959 struct common_audit_data ad;
1960 struct inode *inode = bprm->file->f_path.dentry->d_inode; 1960 struct inode *inode = file_inode(bprm->file);
1961 int rc; 1961 int rc;
1962 1962
1963 rc = cap_bprm_set_creds(bprm); 1963 rc = cap_bprm_set_creds(bprm);
@@ -2929,7 +2929,7 @@ static void selinux_inode_getsecid(const struct inode *inode, u32 *secid)
2929static int selinux_revalidate_file_permission(struct file *file, int mask) 2929static int selinux_revalidate_file_permission(struct file *file, int mask)
2930{ 2930{
2931 const struct cred *cred = current_cred(); 2931 const struct cred *cred = current_cred();
2932 struct inode *inode = file->f_path.dentry->d_inode; 2932 struct inode *inode = file_inode(file);
2933 2933
2934 /* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */ 2934 /* file_mask_to_av won't add FILE__WRITE if MAY_APPEND is set */
2935 if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE)) 2935 if ((file->f_flags & O_APPEND) && (mask & MAY_WRITE))
@@ -2941,7 +2941,7 @@ static int selinux_revalidate_file_permission(struct file *file, int mask)
2941 2941
2942static int selinux_file_permission(struct file *file, int mask) 2942static int selinux_file_permission(struct file *file, int mask)
2943{ 2943{
2944 struct inode *inode = file->f_path.dentry->d_inode; 2944 struct inode *inode = file_inode(file);
2945 struct file_security_struct *fsec = file->f_security; 2945 struct file_security_struct *fsec = file->f_security;
2946 struct inode_security_struct *isec = inode->i_security; 2946 struct inode_security_struct *isec = inode->i_security;
2947 u32 sid = current_sid(); 2947 u32 sid = current_sid();
@@ -3135,11 +3135,6 @@ static int selinux_file_fcntl(struct file *file, unsigned int cmd,
3135 3135
3136 switch (cmd) { 3136 switch (cmd) {
3137 case F_SETFL: 3137 case F_SETFL:
3138 if (!file->f_path.dentry || !file->f_path.dentry->d_inode) {
3139 err = -EINVAL;
3140 break;
3141 }
3142
3143 if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) { 3138 if ((file->f_flags & O_APPEND) && !(arg & O_APPEND)) {
3144 err = file_has_perm(cred, file, FILE__WRITE); 3139 err = file_has_perm(cred, file, FILE__WRITE);
3145 break; 3140 break;
@@ -3162,10 +3157,6 @@ static int selinux_file_fcntl(struct file *file, unsigned int cmd,
3162 case F_SETLK64: 3157 case F_SETLK64:
3163 case F_SETLKW64: 3158 case F_SETLKW64:
3164#endif 3159#endif
3165 if (!file->f_path.dentry || !file->f_path.dentry->d_inode) {
3166 err = -EINVAL;
3167 break;
3168 }
3169 err = file_has_perm(cred, file, FILE__LOCK); 3160 err = file_has_perm(cred, file, FILE__LOCK);
3170 break; 3161 break;
3171 } 3162 }
@@ -3218,7 +3209,7 @@ static int selinux_file_open(struct file *file, const struct cred *cred)
3218 struct inode_security_struct *isec; 3209 struct inode_security_struct *isec;
3219 3210
3220 fsec = file->f_security; 3211 fsec = file->f_security;
3221 isec = file->f_path.dentry->d_inode->i_security; 3212 isec = file_inode(file)->i_security;
3222 /* 3213 /*
3223 * Save inode label and policy sequence number 3214 * Save inode label and policy sequence number
3224 * at open-time so that selinux_file_permission 3215 * at open-time so that selinux_file_permission
@@ -4399,6 +4390,24 @@ static void selinux_req_classify_flow(const struct request_sock *req,
4399 fl->flowi_secid = req->secid; 4390 fl->flowi_secid = req->secid;
4400} 4391}
4401 4392
4393static int selinux_tun_dev_alloc_security(void **security)
4394{
4395 struct tun_security_struct *tunsec;
4396
4397 tunsec = kzalloc(sizeof(*tunsec), GFP_KERNEL);
4398 if (!tunsec)
4399 return -ENOMEM;
4400 tunsec->sid = current_sid();
4401
4402 *security = tunsec;
4403 return 0;
4404}
4405
4406static void selinux_tun_dev_free_security(void *security)
4407{
4408 kfree(security);
4409}
4410
4402static int selinux_tun_dev_create(void) 4411static int selinux_tun_dev_create(void)
4403{ 4412{
4404 u32 sid = current_sid(); 4413 u32 sid = current_sid();
@@ -4414,8 +4423,17 @@ static int selinux_tun_dev_create(void)
4414 NULL); 4423 NULL);
4415} 4424}
4416 4425
4417static void selinux_tun_dev_post_create(struct sock *sk) 4426static int selinux_tun_dev_attach_queue(void *security)
4427{
4428 struct tun_security_struct *tunsec = security;
4429
4430 return avc_has_perm(current_sid(), tunsec->sid, SECCLASS_TUN_SOCKET,
4431 TUN_SOCKET__ATTACH_QUEUE, NULL);
4432}
4433
4434static int selinux_tun_dev_attach(struct sock *sk, void *security)
4418{ 4435{
4436 struct tun_security_struct *tunsec = security;
4419 struct sk_security_struct *sksec = sk->sk_security; 4437 struct sk_security_struct *sksec = sk->sk_security;
4420 4438
4421 /* we don't currently perform any NetLabel based labeling here and it 4439 /* we don't currently perform any NetLabel based labeling here and it
@@ -4425,20 +4443,19 @@ static void selinux_tun_dev_post_create(struct sock *sk)
4425 * cause confusion to the TUN user that had no idea network labeling 4443 * cause confusion to the TUN user that had no idea network labeling
4426 * protocols were being used */ 4444 * protocols were being used */
4427 4445
4428 /* see the comments in selinux_tun_dev_create() about why we don't use 4446 sksec->sid = tunsec->sid;
4429 * the sockcreate SID here */
4430
4431 sksec->sid = current_sid();
4432 sksec->sclass = SECCLASS_TUN_SOCKET; 4447 sksec->sclass = SECCLASS_TUN_SOCKET;
4448
4449 return 0;
4433} 4450}
4434 4451
4435static int selinux_tun_dev_attach(struct sock *sk) 4452static int selinux_tun_dev_open(void *security)
4436{ 4453{
4437 struct sk_security_struct *sksec = sk->sk_security; 4454 struct tun_security_struct *tunsec = security;
4438 u32 sid = current_sid(); 4455 u32 sid = current_sid();
4439 int err; 4456 int err;
4440 4457
4441 err = avc_has_perm(sid, sksec->sid, SECCLASS_TUN_SOCKET, 4458 err = avc_has_perm(sid, tunsec->sid, SECCLASS_TUN_SOCKET,
4442 TUN_SOCKET__RELABELFROM, NULL); 4459 TUN_SOCKET__RELABELFROM, NULL);
4443 if (err) 4460 if (err)
4444 return err; 4461 return err;
@@ -4446,8 +4463,7 @@ static int selinux_tun_dev_attach(struct sock *sk)
4446 TUN_SOCKET__RELABELTO, NULL); 4463 TUN_SOCKET__RELABELTO, NULL);
4447 if (err) 4464 if (err)
4448 return err; 4465 return err;
4449 4466 tunsec->sid = sid;
4450 sksec->sid = sid;
4451 4467
4452 return 0; 4468 return 0;
4453} 4469}
@@ -5642,9 +5658,12 @@ static struct security_operations selinux_ops = {
5642 .secmark_refcount_inc = selinux_secmark_refcount_inc, 5658 .secmark_refcount_inc = selinux_secmark_refcount_inc,
5643 .secmark_refcount_dec = selinux_secmark_refcount_dec, 5659 .secmark_refcount_dec = selinux_secmark_refcount_dec,
5644 .req_classify_flow = selinux_req_classify_flow, 5660 .req_classify_flow = selinux_req_classify_flow,
5661 .tun_dev_alloc_security = selinux_tun_dev_alloc_security,
5662 .tun_dev_free_security = selinux_tun_dev_free_security,
5645 .tun_dev_create = selinux_tun_dev_create, 5663 .tun_dev_create = selinux_tun_dev_create,
5646 .tun_dev_post_create = selinux_tun_dev_post_create, 5664 .tun_dev_attach_queue = selinux_tun_dev_attach_queue,
5647 .tun_dev_attach = selinux_tun_dev_attach, 5665 .tun_dev_attach = selinux_tun_dev_attach,
5666 .tun_dev_open = selinux_tun_dev_open,
5648 5667
5649#ifdef CONFIG_SECURITY_NETWORK_XFRM 5668#ifdef CONFIG_SECURITY_NETWORK_XFRM
5650 .xfrm_policy_alloc_security = selinux_xfrm_policy_alloc, 5669 .xfrm_policy_alloc_security = selinux_xfrm_policy_alloc,