diff options
author | Paul Moore <paul.moore@hp.com> | 2008-10-10 10:16:31 -0400 |
---|---|---|
committer | Paul Moore <paul.moore@hp.com> | 2008-10-10 10:16:31 -0400 |
commit | dfaebe9825ff34983778f287101bc5f3bce00640 (patch) | |
tree | 4dccdcdcecd57fc8bfc083ff30d9e0ecb2e7ecba /security/selinux/hooks.c | |
parent | 99d854d231ce141850b988bdc7e2e7c78f49b03a (diff) |
selinux: Fix missing calls to netlbl_skbuff_err()
At some point I think I messed up and dropped the calls to netlbl_skbuff_err()
which are necessary for CIPSO to send error notifications to remote systems.
This patch re-introduces the error handling calls into the SELinux code.
Signed-off-by: Paul Moore <paul.moore@hp.com>
Acked-by: James Morris <jmorris@namei.org>
Diffstat (limited to 'security/selinux/hooks.c')
-rw-r--r-- | security/selinux/hooks.c | 19 |
1 files changed, 15 insertions, 4 deletions
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index b520667a24be..a91146a6b37d 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c | |||
@@ -4101,6 +4101,8 @@ static int selinux_sock_rcv_skb_compat(struct sock *sk, struct sk_buff *skb, | |||
4101 | return err; | 4101 | return err; |
4102 | err = avc_has_perm(sk_sid, peer_sid, | 4102 | err = avc_has_perm(sk_sid, peer_sid, |
4103 | SECCLASS_PEER, PEER__RECV, &ad); | 4103 | SECCLASS_PEER, PEER__RECV, &ad); |
4104 | if (err) | ||
4105 | selinux_netlbl_err(skb, err, 0); | ||
4104 | } else { | 4106 | } else { |
4105 | err = selinux_netlbl_sock_rcv_skb(sksec, skb, family, &ad); | 4107 | err = selinux_netlbl_sock_rcv_skb(sksec, skb, family, &ad); |
4106 | if (err) | 4108 | if (err) |
@@ -4156,10 +4158,14 @@ static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb) | |||
4156 | return err; | 4158 | return err; |
4157 | err = selinux_inet_sys_rcv_skb(skb->iif, addrp, family, | 4159 | err = selinux_inet_sys_rcv_skb(skb->iif, addrp, family, |
4158 | peer_sid, &ad); | 4160 | peer_sid, &ad); |
4159 | if (err) | 4161 | if (err) { |
4162 | selinux_netlbl_err(skb, err, 0); | ||
4160 | return err; | 4163 | return err; |
4164 | } | ||
4161 | err = avc_has_perm(sk_sid, peer_sid, SECCLASS_PEER, | 4165 | err = avc_has_perm(sk_sid, peer_sid, SECCLASS_PEER, |
4162 | PEER__RECV, &ad); | 4166 | PEER__RECV, &ad); |
4167 | if (err) | ||
4168 | selinux_netlbl_err(skb, err, 0); | ||
4163 | } | 4169 | } |
4164 | 4170 | ||
4165 | if (secmark_active) { | 4171 | if (secmark_active) { |
@@ -4396,6 +4402,7 @@ out: | |||
4396 | static unsigned int selinux_ip_forward(struct sk_buff *skb, int ifindex, | 4402 | static unsigned int selinux_ip_forward(struct sk_buff *skb, int ifindex, |
4397 | u16 family) | 4403 | u16 family) |
4398 | { | 4404 | { |
4405 | int err; | ||
4399 | char *addrp; | 4406 | char *addrp; |
4400 | u32 peer_sid; | 4407 | u32 peer_sid; |
4401 | struct avc_audit_data ad; | 4408 | struct avc_audit_data ad; |
@@ -4419,10 +4426,14 @@ static unsigned int selinux_ip_forward(struct sk_buff *skb, int ifindex, | |||
4419 | if (selinux_parse_skb(skb, &ad, &addrp, 1, NULL) != 0) | 4426 | if (selinux_parse_skb(skb, &ad, &addrp, 1, NULL) != 0) |
4420 | return NF_DROP; | 4427 | return NF_DROP; |
4421 | 4428 | ||
4422 | if (peerlbl_active) | 4429 | if (peerlbl_active) { |
4423 | if (selinux_inet_sys_rcv_skb(ifindex, addrp, family, | 4430 | err = selinux_inet_sys_rcv_skb(ifindex, addrp, family, |
4424 | peer_sid, &ad) != 0) | 4431 | peer_sid, &ad); |
4432 | if (err) { | ||
4433 | selinux_netlbl_err(skb, err, 1); | ||
4425 | return NF_DROP; | 4434 | return NF_DROP; |
4435 | } | ||
4436 | } | ||
4426 | 4437 | ||
4427 | if (secmark_active) | 4438 | if (secmark_active) |
4428 | if (avc_has_perm(peer_sid, skb->secmark, | 4439 | if (avc_has_perm(peer_sid, skb->secmark, |