hooks.c (9f2ad66509b182b399a5b03de487f45bde623524) | hooks.c (3de4bab5b9f8848a0c16a4b1ffe0452f0d670237) |
---|---|
1/* 2 * NSA Security-Enhanced Linux (SELinux) security module 3 * 4 * This file contains the SELinux hook function implementations. 5 * 6 * Authors: Stephen Smalley, <sds@epoch.ncsc.mil> 7 * Chris Vance, <cvance@nai.com> 8 * Wayne Salamon, <wsalamon@nai.com> --- 3560 unchanged lines hidden (view full) --- 3569static int selinux_socket_getpeersec_stream(struct socket *sock, char __user *optval, 3570 int __user *optlen, unsigned len) 3571{ 3572 int err = 0; 3573 char *scontext; 3574 u32 scontext_len; 3575 struct sk_security_struct *ssec; 3576 struct inode_security_struct *isec; | 1/* 2 * NSA Security-Enhanced Linux (SELinux) security module 3 * 4 * This file contains the SELinux hook function implementations. 5 * 6 * Authors: Stephen Smalley, <sds@epoch.ncsc.mil> 7 * Chris Vance, <cvance@nai.com> 8 * Wayne Salamon, <wsalamon@nai.com> --- 3560 unchanged lines hidden (view full) --- 3569static int selinux_socket_getpeersec_stream(struct socket *sock, char __user *optval, 3570 int __user *optlen, unsigned len) 3571{ 3572 int err = 0; 3573 char *scontext; 3574 u32 scontext_len; 3575 struct sk_security_struct *ssec; 3576 struct inode_security_struct *isec; |
3577 u32 peer_sid = 0; | 3577 u32 peer_sid = SECSID_NULL; |
3578 3579 isec = SOCK_INODE(sock)->i_security; 3580 | 3578 3579 isec = SOCK_INODE(sock)->i_security; 3580 |
3581 /* if UNIX_STREAM check peer_sid, if TCP check dst for labelled sa */ 3582 if (isec->sclass == SECCLASS_UNIX_STREAM_SOCKET) { | 3581 if (isec->sclass == SECCLASS_UNIX_STREAM_SOCKET || 3582 isec->sclass == SECCLASS_TCP_SOCKET) { |
3583 ssec = sock->sk->sk_security; 3584 peer_sid = ssec->peer_sid; 3585 } | 3583 ssec = sock->sk->sk_security; 3584 peer_sid = ssec->peer_sid; 3585 } |
3586 else if (isec->sclass == SECCLASS_TCP_SOCKET) { 3587 peer_sid = selinux_netlbl_socket_getpeersec_stream(sock); 3588 if (peer_sid == SECSID_NULL) { 3589 ssec = sock->sk->sk_security; 3590 peer_sid = ssec->peer_sid; 3591 } 3592 if (peer_sid == SECSID_NULL) { 3593 err = -ENOPROTOOPT; 3594 goto out; 3595 } 3596 } 3597 else { | 3586 if (peer_sid == SECSID_NULL) { |
3598 err = -ENOPROTOOPT; 3599 goto out; 3600 } 3601 3602 err = security_sid_to_context(peer_sid, &scontext, &scontext_len); 3603 3604 if (err) 3605 goto out; --- 15 unchanged lines hidden (view full) --- 3621 return err; 3622} 3623 3624static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid) 3625{ 3626 u32 peer_secid = SECSID_NULL; 3627 int err = 0; 3628 | 3587 err = -ENOPROTOOPT; 3588 goto out; 3589 } 3590 3591 err = security_sid_to_context(peer_sid, &scontext, &scontext_len); 3592 3593 if (err) 3594 goto out; --- 15 unchanged lines hidden (view full) --- 3610 return err; 3611} 3612 3613static int selinux_socket_getpeersec_dgram(struct socket *sock, struct sk_buff *skb, u32 *secid) 3614{ 3615 u32 peer_secid = SECSID_NULL; 3616 int err = 0; 3617 |
3629 if (sock && (sock->sk->sk_family == PF_UNIX)) | 3618 if (sock && sock->sk->sk_family == PF_UNIX) |
3630 selinux_get_inode_sid(SOCK_INODE(sock), &peer_secid); | 3619 selinux_get_inode_sid(SOCK_INODE(sock), &peer_secid); |
3631 else if (skb) { 3632 peer_secid = selinux_netlbl_socket_getpeersec_dgram(skb); 3633 if (peer_secid == SECSID_NULL) 3634 peer_secid = selinux_socket_getpeer_dgram(skb); 3635 } | 3620 else if (skb) 3621 security_skb_extlbl_sid(skb, 3622 SECINITSID_UNLABELED, 3623 &peer_secid); |
3636 3637 if (peer_secid == SECSID_NULL) 3638 err = -EINVAL; 3639 *secid = peer_secid; 3640 3641 return err; 3642} 3643 --- 44 unchanged lines hidden (view full) --- 3688static int selinux_inet_conn_request(struct sock *sk, struct sk_buff *skb, 3689 struct request_sock *req) 3690{ 3691 struct sk_security_struct *sksec = sk->sk_security; 3692 int err; 3693 u32 newsid; 3694 u32 peersid; 3695 | 3624 3625 if (peer_secid == SECSID_NULL) 3626 err = -EINVAL; 3627 *secid = peer_secid; 3628 3629 return err; 3630} 3631 --- 44 unchanged lines hidden (view full) --- 3676static int selinux_inet_conn_request(struct sock *sk, struct sk_buff *skb, 3677 struct request_sock *req) 3678{ 3679 struct sk_security_struct *sksec = sk->sk_security; 3680 int err; 3681 u32 newsid; 3682 u32 peersid; 3683 |
3696 newsid = selinux_netlbl_inet_conn_request(skb, sksec->sid); 3697 if (newsid != SECSID_NULL) { 3698 req->secid = newsid; 3699 return 0; 3700 } 3701 3702 selinux_skb_xfrm_sid(skb, &peersid); 3703 | 3684 security_skb_extlbl_sid(skb, SECINITSID_UNLABELED, &peersid); |
3704 if (peersid == SECSID_NULL) { 3705 req->secid = sksec->sid; | 3685 if (peersid == SECSID_NULL) { 3686 req->secid = sksec->sid; |
3706 req->peer_secid = 0; | 3687 req->peer_secid = SECSID_NULL; |
3707 return 0; 3708 } 3709 3710 err = security_sid_mls_copy(sksec->sid, peersid, &newsid); 3711 if (err) 3712 return err; 3713 3714 req->secid = newsid; --- 18 unchanged lines hidden (view full) --- 3733 selinux_netlbl_sk_security_reset(newsksec, req->rsk_ops->family); 3734} 3735 3736static void selinux_inet_conn_established(struct sock *sk, 3737 struct sk_buff *skb) 3738{ 3739 struct sk_security_struct *sksec = sk->sk_security; 3740 | 3688 return 0; 3689 } 3690 3691 err = security_sid_mls_copy(sksec->sid, peersid, &newsid); 3692 if (err) 3693 return err; 3694 3695 req->secid = newsid; --- 18 unchanged lines hidden (view full) --- 3714 selinux_netlbl_sk_security_reset(newsksec, req->rsk_ops->family); 3715} 3716 3717static void selinux_inet_conn_established(struct sock *sk, 3718 struct sk_buff *skb) 3719{ 3720 struct sk_security_struct *sksec = sk->sk_security; 3721 |
3741 selinux_skb_xfrm_sid(skb, &sksec->peer_sid); | 3722 security_skb_extlbl_sid(skb, SECINITSID_UNLABELED, &sksec->peer_sid); |
3742} 3743 3744static void selinux_req_classify_flow(const struct request_sock *req, 3745 struct flowi *fl) 3746{ 3747 fl->secid = req->secid; 3748} 3749 --- 1270 unchanged lines hidden --- | 3723} 3724 3725static void selinux_req_classify_flow(const struct request_sock *req, 3726 struct flowi *fl) 3727{ 3728 fl->secid = req->secid; 3729} 3730 --- 1270 unchanged lines hidden --- |