diff options
Diffstat (limited to 'security/smack/smack_lsm.c')
| -rw-r--r-- | security/smack/smack_lsm.c | 63 | 
1 files changed, 48 insertions, 15 deletions
diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c index 81c03a59711..45c32f07416 100644 --- a/security/smack/smack_lsm.c +++ b/security/smack/smack_lsm.c @@ -1939,18 +1939,19 @@ static int smack_netlabel_send(struct sock *sk, struct sockaddr_in *sap)  	char *hostsp;  	struct socket_smack *ssp = sk->sk_security;  	struct smk_audit_info ad; -	struct lsm_network_audit net;  	rcu_read_lock();  	hostsp = smack_host_label(sap);  	if (hostsp != NULL) { -		sk_lbl = SMACK_UNLABELED_SOCKET;  #ifdef CONFIG_AUDIT +		struct lsm_network_audit net; +  		smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net);  		ad.a.u.net->family = sap->sin_family;  		ad.a.u.net->dport = sap->sin_port;  		ad.a.u.net->v4info.daddr = sap->sin_addr.s_addr;  #endif +		sk_lbl = SMACK_UNLABELED_SOCKET;  		rc = smk_access(ssp->smk_out, hostsp, MAY_WRITE, &ad);  	} else {  		sk_lbl = SMACK_CIPSO_SOCKET; @@ -2809,11 +2810,14 @@ static int smack_unix_stream_connect(struct sock *sock,  	struct socket_smack *osp = other->sk_security;  	struct socket_smack *nsp = newsk->sk_security;  	struct smk_audit_info ad; -	struct lsm_network_audit net;  	int rc = 0; +#ifdef CONFIG_AUDIT +	struct lsm_network_audit net; +  	smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net);  	smk_ad_setfield_u_net_sk(&ad, other); +#endif  	if (!capable(CAP_MAC_OVERRIDE))  		rc = smk_access(ssp->smk_out, osp->smk_in, MAY_WRITE, &ad); @@ -2842,11 +2846,14 @@ static int smack_unix_may_send(struct socket *sock, struct socket *other)  	struct socket_smack *ssp = sock->sk->sk_security;  	struct socket_smack *osp = other->sk->sk_security;  	struct smk_audit_info ad; -	struct lsm_network_audit net;  	int rc = 0; +#ifdef CONFIG_AUDIT +	struct lsm_network_audit net; +  	smk_ad_init_net(&ad, __func__, LSM_AUDIT_DATA_NET, &net);  	smk_ad_setfield_u_net_sk(&ad, other->sk); +#endif  	if (!capable(CAP_MAC_OVERRIDE))  		rc = smk_access(ssp->smk_out, osp->smk_in, MAY_WRITE, &ad); @@ -2993,7 +3000,9 @@ static int smack_socket_sock_rcv_skb(struct sock *sk, struct sk_buff *skb)  	char *csp;  	int rc;  	struct smk_audit_info ad; +#ifdef CONFIG_AUDIT  	struct lsm_network_audit net; +#endif  	if (sk->sk_family != PF_INET && sk->sk_family != PF_INET6)  		return 0; @@ -3156,7 +3165,9 @@ static int smack_inet_conn_request(struct sock *sk, struct sk_buff *skb,  	char *sp;  	int rc;  	struct smk_audit_info ad; +#ifdef CONFIG_AUDIT  	struct lsm_network_audit net; +#endif  	/* handle mapped IPv4 packets arriving via IPv6 sockets */  	if (family == PF_INET6 && skb->protocol == htons(ETH_P_IP)) @@ -3629,8 +3640,38 @@ struct security_operations smack_ops = {  }; -static __init void init_smack_know_list(void) +static __init void init_smack_known_list(void)  { +	/* +	 * Initialize CIPSO locks +	 */ +	spin_lock_init(&smack_known_huh.smk_cipsolock); +	spin_lock_init(&smack_known_hat.smk_cipsolock); +	spin_lock_init(&smack_known_star.smk_cipsolock); +	spin_lock_init(&smack_known_floor.smk_cipsolock); +	spin_lock_init(&smack_known_invalid.smk_cipsolock); +	spin_lock_init(&smack_known_web.smk_cipsolock); +	/* +	 * Initialize rule list locks +	 */ +	mutex_init(&smack_known_huh.smk_rules_lock); +	mutex_init(&smack_known_hat.smk_rules_lock); +	mutex_init(&smack_known_floor.smk_rules_lock); +	mutex_init(&smack_known_star.smk_rules_lock); +	mutex_init(&smack_known_invalid.smk_rules_lock); +	mutex_init(&smack_known_web.smk_rules_lock); +	/* +	 * Initialize rule lists +	 */ +	INIT_LIST_HEAD(&smack_known_huh.smk_rules); +	INIT_LIST_HEAD(&smack_known_hat.smk_rules); +	INIT_LIST_HEAD(&smack_known_star.smk_rules); +	INIT_LIST_HEAD(&smack_known_floor.smk_rules); +	INIT_LIST_HEAD(&smack_known_invalid.smk_rules); +	INIT_LIST_HEAD(&smack_known_web.smk_rules); +	/* +	 * Create the known labels list +	 */  	list_add(&smack_known_huh.list, &smack_known_list);  	list_add(&smack_known_hat.list, &smack_known_list);  	list_add(&smack_known_star.list, &smack_known_list); @@ -3665,16 +3706,8 @@ static __init int smack_init(void)  	cred = (struct cred *) current->cred;  	cred->security = tsp; -	/* initialize the smack_know_list */ -	init_smack_know_list(); -	/* -	 * Initialize locks -	 */ -	spin_lock_init(&smack_known_huh.smk_cipsolock); -	spin_lock_init(&smack_known_hat.smk_cipsolock); -	spin_lock_init(&smack_known_star.smk_cipsolock); -	spin_lock_init(&smack_known_floor.smk_cipsolock); -	spin_lock_init(&smack_known_invalid.smk_cipsolock); +	/* initialize the smack_known_list */ +	init_smack_known_list();  	/*  	 * Register with LSM  |