diff options
Diffstat (limited to 'net/tipc')
| -rw-r--r-- | net/tipc/bearer.c | 4 | ||||
| -rw-r--r-- | net/tipc/crypto.c | 27 | ||||
| -rw-r--r-- | net/tipc/link.c | 3 | ||||
| -rw-r--r-- | net/tipc/socket.c | 2 | 
4 files changed, 14 insertions, 22 deletions
| diff --git a/net/tipc/bearer.c b/net/tipc/bearer.c index 60bc74b76adc..473a790f5894 100644 --- a/net/tipc/bearer.c +++ b/net/tipc/bearer.c @@ -787,7 +787,7 @@ int tipc_attach_loopback(struct net *net)  	if (!dev)  		return -ENODEV; -	dev_hold(dev); +	dev_hold_track(dev, &tn->loopback_pt.dev_tracker, GFP_KERNEL);  	tn->loopback_pt.dev = dev;  	tn->loopback_pt.type = htons(ETH_P_TIPC);  	tn->loopback_pt.func = tipc_loopback_rcv_pkt; @@ -800,7 +800,7 @@ void tipc_detach_loopback(struct net *net)  	struct tipc_net *tn = tipc_net(net);  	dev_remove_pack(&tn->loopback_pt); -	dev_put(net->loopback_dev); +	dev_put_track(net->loopback_dev, &tn->loopback_pt.dev_tracker);  }  /* Caller should hold rtnl_lock to protect the bearer */ diff --git a/net/tipc/crypto.c b/net/tipc/crypto.c index b4d9419a015b..9325479295b8 100644 --- a/net/tipc/crypto.c +++ b/net/tipc/crypto.c @@ -524,7 +524,7 @@ static int tipc_aead_init(struct tipc_aead **aead, struct tipc_aead_key *ukey,  		return -EEXIST;  	/* Allocate a new AEAD */ -	tmp = kzalloc(sizeof(*tmp), GFP_KERNEL); +	tmp = kzalloc(sizeof(*tmp), GFP_ATOMIC);  	if (unlikely(!tmp))  		return -ENOMEM; @@ -761,21 +761,10 @@ static int tipc_aead_encrypt(struct tipc_aead *aead, struct sk_buff *skb,  			 skb_tailroom(skb), tailen);  	} -	if (unlikely(!skb_cloned(skb) && tailen <= skb_tailroom(skb))) { -		nsg = 1; -		trailer = skb; -	} else { -		/* TODO: We could avoid skb_cow_data() if skb has no frag_list -		 * e.g. by skb_fill_page_desc() to add another page to the skb -		 * with the wanted tailen... However, page skbs look not often, -		 * so take it easy now! -		 * Cloned skbs e.g. from link_xmit() seems no choice though :( -		 */ -		nsg = skb_cow_data(skb, tailen, &trailer); -		if (unlikely(nsg < 0)) { -			pr_err("TX: skb_cow_data() returned %d\n", nsg); -			return nsg; -		} +	nsg = skb_cow_data(skb, tailen, &trailer); +	if (unlikely(nsg < 0)) { +		pr_err("TX: skb_cow_data() returned %d\n", nsg); +		return nsg;  	}  	pskb_put(skb, trailer, tailen); @@ -1474,7 +1463,7 @@ int tipc_crypto_start(struct tipc_crypto **crypto, struct net *net,  		return -EEXIST;  	/* Allocate crypto */ -	c = kzalloc(sizeof(*c), GFP_KERNEL); +	c = kzalloc(sizeof(*c), GFP_ATOMIC);  	if (!c)  		return -ENOMEM; @@ -1488,7 +1477,7 @@ int tipc_crypto_start(struct tipc_crypto **crypto, struct net *net,  	}  	/* Allocate statistic structure */ -	c->stats = alloc_percpu(struct tipc_crypto_stats); +	c->stats = alloc_percpu_gfp(struct tipc_crypto_stats, GFP_ATOMIC);  	if (!c->stats) {  		if (c->wq)  			destroy_workqueue(c->wq); @@ -2461,7 +2450,7 @@ static void tipc_crypto_work_tx(struct work_struct *work)  	}  	/* Lets duplicate it first */ -	skey = kmemdup(aead->key, tipc_aead_key_size(aead->key), GFP_KERNEL); +	skey = kmemdup(aead->key, tipc_aead_key_size(aead->key), GFP_ATOMIC);  	rcu_read_unlock();  	/* Now, generate new key, initiate & distribute it */ diff --git a/net/tipc/link.c b/net/tipc/link.c index 09ae8448f394..8d9e09f48f4c 100644 --- a/net/tipc/link.c +++ b/net/tipc/link.c @@ -1298,7 +1298,8 @@ static bool tipc_data_input(struct tipc_link *l, struct sk_buff *skb,  		return false;  #ifdef CONFIG_TIPC_CRYPTO  	case MSG_CRYPTO: -		if (TIPC_SKB_CB(skb)->decrypted) { +		if (sysctl_tipc_key_exchange_enabled && +		    TIPC_SKB_CB(skb)->decrypted) {  			tipc_crypto_msg_rcv(l->net, skb);  			return true;  		} diff --git a/net/tipc/socket.c b/net/tipc/socket.c index ad570c2450be..3e63c83e641c 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -1461,6 +1461,8 @@ static int __tipc_sendmsg(struct socket *sock, struct msghdr *m, size_t dlen)  		msg_set_syn(hdr, 1);  	} +	memset(&skaddr, 0, sizeof(skaddr)); +  	/* Determine destination */  	if (atype == TIPC_SERVICE_RANGE) {  		return tipc_sendmcast(sock, ua, m, dlen, timeout); |