aboutsummaryrefslogtreecommitdiffstats
path: root/security/selinux
diff options
context:
space:
mode:
authorPaul Moore <paul.moore@hp.com>2010-04-22 14:46:18 -0400
committerJames Morris <jmorris@namei.org>2010-08-02 01:34:37 -0400
commit4d1e24514d80cb266231d0c1b6c02161970ad019 (patch)
tree2de35d44c52dc1afa28c8f1bf294180817834a9d /security/selinux
parente79acf0ef45e0b54aed47ebea7f25c540d3f527e (diff)
selinux: Set the peer label correctly on connected UNIX domain sockets
Correct a problem where we weren't setting the peer label correctly on the client end of a pair of connected UNIX sockets. Signed-off-by: Paul Moore <paul.moore@hp.com> Acked-by: Eric Paris <eparis@redhat.com> Signed-off-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'security/selinux')
-rw-r--r--security/selinux/hooks.c30
1 files changed, 14 insertions, 16 deletions
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c
index 5c9f25ba1c95..190fd0ffb13e 100644
--- a/security/selinux/hooks.c
+++ b/security/selinux/hooks.c
@@ -3980,34 +3980,32 @@ static int selinux_socket_unix_stream_connect(struct socket *sock,
3980 struct socket *other, 3980 struct socket *other,
3981 struct sock *newsk) 3981 struct sock *newsk)
3982{ 3982{
3983 struct sk_security_struct *sksec; 3983 struct sk_security_struct *sksec_sock = sock->sk->sk_security;
3984 struct inode_security_struct *isec; 3984 struct sk_security_struct *sksec_other = other->sk->sk_security;
3985 struct inode_security_struct *other_isec; 3985 struct sk_security_struct *sksec_new = newsk->sk_security;
3986 struct common_audit_data ad; 3986 struct common_audit_data ad;
3987 int err; 3987 int err;
3988 3988
3989 isec = SOCK_INODE(sock)->i_security;
3990 other_isec = SOCK_INODE(other)->i_security;
3991
3992 COMMON_AUDIT_DATA_INIT(&ad, NET); 3989 COMMON_AUDIT_DATA_INIT(&ad, NET);
3993 ad.u.net.sk = other->sk; 3990 ad.u.net.sk = other->sk;
3994 3991
3995 err = avc_has_perm(isec->sid, other_isec->sid, 3992 err = avc_has_perm(sksec_sock->sid, sksec_other->sid,
3996 isec->sclass, 3993 sksec_other->sclass,
3997 UNIX_STREAM_SOCKET__CONNECTTO, &ad); 3994 UNIX_STREAM_SOCKET__CONNECTTO, &ad);
3998 if (err) 3995 if (err)
3999 return err; 3996 return err;
4000 3997
4001 /* connecting socket */
4002 sksec = sock->sk->sk_security;
4003 sksec->peer_sid = other_isec->sid;
4004
4005 /* server child socket */ 3998 /* server child socket */
4006 sksec = newsk->sk_security; 3999 sksec_new->peer_sid = sksec_sock->sid;
4007 sksec->peer_sid = isec->sid; 4000 err = security_sid_mls_copy(sksec_other->sid, sksec_sock->sid,
4008 err = security_sid_mls_copy(other_isec->sid, sksec->peer_sid, &sksec->sid); 4001 &sksec_new->sid);
4002 if (err)
4003 return err;
4009 4004
4010 return err; 4005 /* connecting socket */
4006 sksec_sock->peer_sid = sksec_new->sid;
4007
4008 return 0;
4011} 4009}
4012 4010
4013static int selinux_socket_unix_may_send(struct socket *sock, 4011static int selinux_socket_unix_may_send(struct socket *sock,