|
@@ -3517,8 +3517,8 @@ static int selinux_parse_skb_ipv4(struct sk_buff *skb,
|
|
|
if (ihlen < sizeof(_iph))
|
|
|
goto out;
|
|
|
|
|
|
- ad->u.net.v4info.saddr = ih->saddr;
|
|
|
- ad->u.net.v4info.daddr = ih->daddr;
|
|
|
+ ad->u.net->v4info.saddr = ih->saddr;
|
|
|
+ ad->u.net->v4info.daddr = ih->daddr;
|
|
|
ret = 0;
|
|
|
|
|
|
if (proto)
|
|
@@ -3536,8 +3536,8 @@ static int selinux_parse_skb_ipv4(struct sk_buff *skb,
|
|
|
if (th == NULL)
|
|
|
break;
|
|
|
|
|
|
- ad->u.net.sport = th->source;
|
|
|
- ad->u.net.dport = th->dest;
|
|
|
+ ad->u.net->sport = th->source;
|
|
|
+ ad->u.net->dport = th->dest;
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -3552,8 +3552,8 @@ static int selinux_parse_skb_ipv4(struct sk_buff *skb,
|
|
|
if (uh == NULL)
|
|
|
break;
|
|
|
|
|
|
- ad->u.net.sport = uh->source;
|
|
|
- ad->u.net.dport = uh->dest;
|
|
|
+ ad->u.net->sport = uh->source;
|
|
|
+ ad->u.net->dport = uh->dest;
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -3568,8 +3568,8 @@ static int selinux_parse_skb_ipv4(struct sk_buff *skb,
|
|
|
if (dh == NULL)
|
|
|
break;
|
|
|
|
|
|
- ad->u.net.sport = dh->dccph_sport;
|
|
|
- ad->u.net.dport = dh->dccph_dport;
|
|
|
+ ad->u.net->sport = dh->dccph_sport;
|
|
|
+ ad->u.net->dport = dh->dccph_dport;
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -3596,8 +3596,8 @@ static int selinux_parse_skb_ipv6(struct sk_buff *skb,
|
|
|
if (ip6 == NULL)
|
|
|
goto out;
|
|
|
|
|
|
- ad->u.net.v6info.saddr = ip6->saddr;
|
|
|
- ad->u.net.v6info.daddr = ip6->daddr;
|
|
|
+ ad->u.net->v6info.saddr = ip6->saddr;
|
|
|
+ ad->u.net->v6info.daddr = ip6->daddr;
|
|
|
ret = 0;
|
|
|
|
|
|
nexthdr = ip6->nexthdr;
|
|
@@ -3617,8 +3617,8 @@ static int selinux_parse_skb_ipv6(struct sk_buff *skb,
|
|
|
if (th == NULL)
|
|
|
break;
|
|
|
|
|
|
- ad->u.net.sport = th->source;
|
|
|
- ad->u.net.dport = th->dest;
|
|
|
+ ad->u.net->sport = th->source;
|
|
|
+ ad->u.net->dport = th->dest;
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -3629,8 +3629,8 @@ static int selinux_parse_skb_ipv6(struct sk_buff *skb,
|
|
|
if (uh == NULL)
|
|
|
break;
|
|
|
|
|
|
- ad->u.net.sport = uh->source;
|
|
|
- ad->u.net.dport = uh->dest;
|
|
|
+ ad->u.net->sport = uh->source;
|
|
|
+ ad->u.net->dport = uh->dest;
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -3641,8 +3641,8 @@ static int selinux_parse_skb_ipv6(struct sk_buff *skb,
|
|
|
if (dh == NULL)
|
|
|
break;
|
|
|
|
|
|
- ad->u.net.sport = dh->dccph_sport;
|
|
|
- ad->u.net.dport = dh->dccph_dport;
|
|
|
+ ad->u.net->sport = dh->dccph_sport;
|
|
|
+ ad->u.net->dport = dh->dccph_dport;
|
|
|
break;
|
|
|
}
|
|
|
|
|
@@ -3662,13 +3662,13 @@ static int selinux_parse_skb(struct sk_buff *skb, struct common_audit_data *ad,
|
|
|
char *addrp;
|
|
|
int ret;
|
|
|
|
|
|
- switch (ad->u.net.family) {
|
|
|
+ switch (ad->u.net->family) {
|
|
|
case PF_INET:
|
|
|
ret = selinux_parse_skb_ipv4(skb, ad, proto);
|
|
|
if (ret)
|
|
|
goto parse_error;
|
|
|
- addrp = (char *)(src ? &ad->u.net.v4info.saddr :
|
|
|
- &ad->u.net.v4info.daddr);
|
|
|
+ addrp = (char *)(src ? &ad->u.net->v4info.saddr :
|
|
|
+ &ad->u.net->v4info.daddr);
|
|
|
goto okay;
|
|
|
|
|
|
#if defined(CONFIG_IPV6) || defined(CONFIG_IPV6_MODULE)
|
|
@@ -3676,8 +3676,8 @@ static int selinux_parse_skb(struct sk_buff *skb, struct common_audit_data *ad,
|
|
|
ret = selinux_parse_skb_ipv6(skb, ad, proto);
|
|
|
if (ret)
|
|
|
goto parse_error;
|
|
|
- addrp = (char *)(src ? &ad->u.net.v6info.saddr :
|
|
|
- &ad->u.net.v6info.daddr);
|
|
|
+ addrp = (char *)(src ? &ad->u.net->v6info.saddr :
|
|
|
+ &ad->u.net->v6info.daddr);
|
|
|
goto okay;
|
|
|
#endif /* IPV6 */
|
|
|
default:
|
|
@@ -3752,6 +3752,7 @@ static int sock_has_perm(struct task_struct *task, struct sock *sk, u32 perms)
|
|
|
struct sk_security_struct *sksec = sk->sk_security;
|
|
|
struct common_audit_data ad;
|
|
|
struct selinux_audit_data sad = {0,};
|
|
|
+ struct lsm_network_audit net = {0,};
|
|
|
u32 tsid = task_sid(task);
|
|
|
|
|
|
if (sksec->sid == SECINITSID_KERNEL)
|
|
@@ -3759,7 +3760,8 @@ static int sock_has_perm(struct task_struct *task, struct sock *sk, u32 perms)
|
|
|
|
|
|
COMMON_AUDIT_DATA_INIT(&ad, NET);
|
|
|
ad.selinux_audit_data = &sad;
|
|
|
- ad.u.net.sk = sk;
|
|
|
+ ad.u.net = &net;
|
|
|
+ ad.u.net->sk = sk;
|
|
|
|
|
|
return avc_has_perm(tsid, sksec->sid, sksec->sclass, perms, &ad);
|
|
|
}
|
|
@@ -3838,6 +3840,7 @@ static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, in
|
|
|
struct sk_security_struct *sksec = sk->sk_security;
|
|
|
struct common_audit_data ad;
|
|
|
struct selinux_audit_data sad = {0,};
|
|
|
+ struct lsm_network_audit net = {0,};
|
|
|
struct sockaddr_in *addr4 = NULL;
|
|
|
struct sockaddr_in6 *addr6 = NULL;
|
|
|
unsigned short snum;
|
|
@@ -3865,8 +3868,9 @@ static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, in
|
|
|
goto out;
|
|
|
COMMON_AUDIT_DATA_INIT(&ad, NET);
|
|
|
ad.selinux_audit_data = &sad;
|
|
|
- ad.u.net.sport = htons(snum);
|
|
|
- ad.u.net.family = family;
|
|
|
+ ad.u.net = &net;
|
|
|
+ ad.u.net->sport = htons(snum);
|
|
|
+ ad.u.net->family = family;
|
|
|
err = avc_has_perm(sksec->sid, sid,
|
|
|
sksec->sclass,
|
|
|
SOCKET__NAME_BIND, &ad);
|
|
@@ -3899,13 +3903,14 @@ static int selinux_socket_bind(struct socket *sock, struct sockaddr *address, in
|
|
|
|
|
|
COMMON_AUDIT_DATA_INIT(&ad, NET);
|
|
|
ad.selinux_audit_data = &sad;
|
|
|
- ad.u.net.sport = htons(snum);
|
|
|
- ad.u.net.family = family;
|
|
|
+ ad.u.net = &net;
|
|
|
+ ad.u.net->sport = htons(snum);
|
|
|
+ ad.u.net->family = family;
|
|
|
|
|
|
if (family == PF_INET)
|
|
|
- ad.u.net.v4info.saddr = addr4->sin_addr.s_addr;
|
|
|
+ ad.u.net->v4info.saddr = addr4->sin_addr.s_addr;
|
|
|
else
|
|
|
- ad.u.net.v6info.saddr = addr6->sin6_addr;
|
|
|
+ ad.u.net->v6info.saddr = addr6->sin6_addr;
|
|
|
|
|
|
err = avc_has_perm(sksec->sid, sid,
|
|
|
sksec->sclass, node_perm, &ad);
|
|
@@ -3933,6 +3938,7 @@ static int selinux_socket_connect(struct socket *sock, struct sockaddr *address,
|
|
|
sksec->sclass == SECCLASS_DCCP_SOCKET) {
|
|
|
struct common_audit_data ad;
|
|
|
struct selinux_audit_data sad = {0,};
|
|
|
+ struct lsm_network_audit net = {0,};
|
|
|
struct sockaddr_in *addr4 = NULL;
|
|
|
struct sockaddr_in6 *addr6 = NULL;
|
|
|
unsigned short snum;
|
|
@@ -3959,8 +3965,9 @@ static int selinux_socket_connect(struct socket *sock, struct sockaddr *address,
|
|
|
|
|
|
COMMON_AUDIT_DATA_INIT(&ad, NET);
|
|
|
ad.selinux_audit_data = &sad;
|
|
|
- ad.u.net.dport = htons(snum);
|
|
|
- ad.u.net.family = sk->sk_family;
|
|
|
+ ad.u.net = &net;
|
|
|
+ ad.u.net->dport = htons(snum);
|
|
|
+ ad.u.net->family = sk->sk_family;
|
|
|
err = avc_has_perm(sksec->sid, sid, sksec->sclass, perm, &ad);
|
|
|
if (err)
|
|
|
goto out;
|
|
@@ -4050,11 +4057,13 @@ static int selinux_socket_unix_stream_connect(struct sock *sock,
|
|
|
struct sk_security_struct *sksec_new = newsk->sk_security;
|
|
|
struct common_audit_data ad;
|
|
|
struct selinux_audit_data sad = {0,};
|
|
|
+ struct lsm_network_audit net = {0,};
|
|
|
int err;
|
|
|
|
|
|
COMMON_AUDIT_DATA_INIT(&ad, NET);
|
|
|
ad.selinux_audit_data = &sad;
|
|
|
- ad.u.net.sk = other;
|
|
|
+ ad.u.net = &net;
|
|
|
+ ad.u.net->sk = other;
|
|
|
|
|
|
err = avc_has_perm(sksec_sock->sid, sksec_other->sid,
|
|
|
sksec_other->sclass,
|
|
@@ -4082,10 +4091,12 @@ static int selinux_socket_unix_may_send(struct socket *sock,
|
|
|
struct sk_security_struct *osec = other->sk->sk_security;
|
|
|
struct common_audit_data ad;
|
|
|
struct selinux_audit_data sad = {0,};
|
|
|
+ struct lsm_network_audit net = {0,};
|
|
|
|
|
|
COMMON_AUDIT_DATA_INIT(&ad, NET);
|
|
|
ad.selinux_audit_data = &sad;
|
|
|
- ad.u.net.sk = other->sk;
|
|
|
+ ad.u.net = &net;
|
|
|
+ ad.u.net->sk = other->sk;
|
|
|
|
|
|
return avc_has_perm(ssec->sid, osec->sid, osec->sclass, SOCKET__SENDTO,
|
|
|
&ad);
|
|
@@ -4122,12 +4133,14 @@ static int selinux_sock_rcv_skb_compat(struct sock *sk, struct sk_buff *skb,
|
|
|
u32 sk_sid = sksec->sid;
|
|
|
struct common_audit_data ad;
|
|
|
struct selinux_audit_data sad = {0,};
|
|
|
+ struct lsm_network_audit net = {0,};
|
|
|
char *addrp;
|
|
|
|
|
|
COMMON_AUDIT_DATA_INIT(&ad, NET);
|
|
|
ad.selinux_audit_data = &sad;
|
|
|
- ad.u.net.netif = skb->skb_iif;
|
|
|
- ad.u.net.family = family;
|
|
|
+ ad.u.net = &net;
|
|
|
+ ad.u.net->netif = skb->skb_iif;
|
|
|
+ ad.u.net->family = family;
|
|
|
err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
|
|
|
if (err)
|
|
|
return err;
|
|
@@ -4155,6 +4168,7 @@ static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
|
|
u32 sk_sid = sksec->sid;
|
|
|
struct common_audit_data ad;
|
|
|
struct selinux_audit_data sad = {0,};
|
|
|
+ struct lsm_network_audit net = {0,};
|
|
|
char *addrp;
|
|
|
u8 secmark_active;
|
|
|
u8 peerlbl_active;
|
|
@@ -4180,8 +4194,9 @@ static int selinux_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)
|
|
|
|
|
|
COMMON_AUDIT_DATA_INIT(&ad, NET);
|
|
|
ad.selinux_audit_data = &sad;
|
|
|
- ad.u.net.netif = skb->skb_iif;
|
|
|
- ad.u.net.family = family;
|
|
|
+ ad.u.net = &net;
|
|
|
+ ad.u.net->netif = skb->skb_iif;
|
|
|
+ ad.u.net->family = family;
|
|
|
err = selinux_parse_skb(skb, &ad, &addrp, 1, NULL);
|
|
|
if (err)
|
|
|
return err;
|
|
@@ -4517,6 +4532,7 @@ static unsigned int selinux_ip_forward(struct sk_buff *skb, int ifindex,
|
|
|
u32 peer_sid;
|
|
|
struct common_audit_data ad;
|
|
|
struct selinux_audit_data sad = {0,};
|
|
|
+ struct lsm_network_audit net = {0,};
|
|
|
u8 secmark_active;
|
|
|
u8 netlbl_active;
|
|
|
u8 peerlbl_active;
|
|
@@ -4535,8 +4551,9 @@ static unsigned int selinux_ip_forward(struct sk_buff *skb, int ifindex,
|
|
|
|
|
|
COMMON_AUDIT_DATA_INIT(&ad, NET);
|
|
|
ad.selinux_audit_data = &sad;
|
|
|
- ad.u.net.netif = ifindex;
|
|
|
- ad.u.net.family = family;
|
|
|
+ ad.u.net = &net;
|
|
|
+ ad.u.net->netif = ifindex;
|
|
|
+ ad.u.net->family = family;
|
|
|
if (selinux_parse_skb(skb, &ad, &addrp, 1, NULL) != 0)
|
|
|
return NF_DROP;
|
|
|
|
|
@@ -4624,6 +4641,7 @@ static unsigned int selinux_ip_postroute_compat(struct sk_buff *skb,
|
|
|
struct sk_security_struct *sksec;
|
|
|
struct common_audit_data ad;
|
|
|
struct selinux_audit_data sad = {0,};
|
|
|
+ struct lsm_network_audit net = {0,};
|
|
|
char *addrp;
|
|
|
u8 proto;
|
|
|
|
|
@@ -4633,8 +4651,9 @@ static unsigned int selinux_ip_postroute_compat(struct sk_buff *skb,
|
|
|
|
|
|
COMMON_AUDIT_DATA_INIT(&ad, NET);
|
|
|
ad.selinux_audit_data = &sad;
|
|
|
- ad.u.net.netif = ifindex;
|
|
|
- ad.u.net.family = family;
|
|
|
+ ad.u.net = &net;
|
|
|
+ ad.u.net->netif = ifindex;
|
|
|
+ ad.u.net->family = family;
|
|
|
if (selinux_parse_skb(skb, &ad, &addrp, 0, &proto))
|
|
|
return NF_DROP;
|
|
|
|
|
@@ -4657,6 +4676,7 @@ static unsigned int selinux_ip_postroute(struct sk_buff *skb, int ifindex,
|
|
|
struct sock *sk;
|
|
|
struct common_audit_data ad;
|
|
|
struct selinux_audit_data sad = {0,};
|
|
|
+ struct lsm_network_audit net = {0,};
|
|
|
char *addrp;
|
|
|
u8 secmark_active;
|
|
|
u8 peerlbl_active;
|
|
@@ -4704,8 +4724,9 @@ static unsigned int selinux_ip_postroute(struct sk_buff *skb, int ifindex,
|
|
|
|
|
|
COMMON_AUDIT_DATA_INIT(&ad, NET);
|
|
|
ad.selinux_audit_data = &sad;
|
|
|
- ad.u.net.netif = ifindex;
|
|
|
- ad.u.net.family = family;
|
|
|
+ ad.u.net = &net;
|
|
|
+ ad.u.net->netif = ifindex;
|
|
|
+ ad.u.net->family = family;
|
|
|
if (selinux_parse_skb(skb, &ad, &addrp, 0, NULL))
|
|
|
return NF_DROP;
|
|
|
|