diff options
Diffstat (limited to 'security/selinux/hooks.c')
| -rw-r--r-- | security/selinux/hooks.c | 105 | 
1 files changed, 63 insertions, 42 deletions
diff --git a/security/selinux/hooks.c b/security/selinux/hooks.c index 3861ce4b100..d85b793c932 100644 --- a/security/selinux/hooks.c +++ b/security/selinux/hooks.c @@ -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;  |