diff options
Diffstat (limited to 'net/tipc')
| -rw-r--r-- | net/tipc/core.c | 3 | ||||
| -rw-r--r-- | net/tipc/node.c | 41 | ||||
| -rw-r--r-- | net/tipc/socket.c | 3 | 
3 files changed, 25 insertions, 22 deletions
| diff --git a/net/tipc/core.c b/net/tipc/core.c index 3f4542e0f065..434e70eabe08 100644 --- a/net/tipc/core.c +++ b/net/tipc/core.c @@ -109,10 +109,9 @@ static void __net_exit tipc_exit_net(struct net *net)  	struct tipc_net *tn = tipc_net(net);  	tipc_detach_loopback(net); +	tipc_net_stop(net);  	/* Make sure the tipc_net_finalize_work() finished */  	cancel_work_sync(&tn->work); -	tipc_net_stop(net); -  	tipc_bcast_stop(net);  	tipc_nametbl_stop(net);  	tipc_sk_rht_destroy(net); diff --git a/net/tipc/node.c b/net/tipc/node.c index 6ef95ce565bd..b48d97cbbe29 100644 --- a/net/tipc/node.c +++ b/net/tipc/node.c @@ -472,8 +472,8 @@ struct tipc_node *tipc_node_create(struct net *net, u32 addr, u8 *peer_id,  				   bool preliminary)  {  	struct tipc_net *tn = net_generic(net, tipc_net_id); +	struct tipc_link *l, *snd_l = tipc_bc_sndlink(net);  	struct tipc_node *n, *temp_node; -	struct tipc_link *l;  	unsigned long intv;  	int bearer_id;  	int i; @@ -488,6 +488,16 @@ struct tipc_node *tipc_node_create(struct net *net, u32 addr, u8 *peer_id,  			goto exit;  		/* A preliminary node becomes "real" now, refresh its data */  		tipc_node_write_lock(n); +		if (!tipc_link_bc_create(net, tipc_own_addr(net), addr, peer_id, U16_MAX, +					 tipc_link_min_win(snd_l), tipc_link_max_win(snd_l), +					 n->capabilities, &n->bc_entry.inputq1, +					 &n->bc_entry.namedq, snd_l, &n->bc_entry.link)) { +			pr_warn("Broadcast rcv link refresh failed, no memory\n"); +			tipc_node_write_unlock_fast(n); +			tipc_node_put(n); +			n = NULL; +			goto exit; +		}  		n->preliminary = false;  		n->addr = addr;  		hlist_del_rcu(&n->hash); @@ -567,7 +577,16 @@ update:  	n->signature = INVALID_NODE_SIG;  	n->active_links[0] = INVALID_BEARER_ID;  	n->active_links[1] = INVALID_BEARER_ID; -	n->bc_entry.link = NULL; +	if (!preliminary && +	    !tipc_link_bc_create(net, tipc_own_addr(net), addr, peer_id, U16_MAX, +				 tipc_link_min_win(snd_l), tipc_link_max_win(snd_l), +				 n->capabilities, &n->bc_entry.inputq1, +				 &n->bc_entry.namedq, snd_l, &n->bc_entry.link)) { +		pr_warn("Broadcast rcv link creation failed, no memory\n"); +		kfree(n); +		n = NULL; +		goto exit; +	}  	tipc_node_get(n);  	timer_setup(&n->timer, tipc_node_timeout, 0);  	/* Start a slow timer anyway, crypto needs it */ @@ -1155,7 +1174,7 @@ void tipc_node_check_dest(struct net *net, u32 addr,  			  bool *respond, bool *dupl_addr)  {  	struct tipc_node *n; -	struct tipc_link *l, *snd_l; +	struct tipc_link *l;  	struct tipc_link_entry *le;  	bool addr_match = false;  	bool sign_match = false; @@ -1175,22 +1194,6 @@ void tipc_node_check_dest(struct net *net, u32 addr,  		return;  	tipc_node_write_lock(n); -	if (unlikely(!n->bc_entry.link)) { -		snd_l = tipc_bc_sndlink(net); -		if (!tipc_link_bc_create(net, tipc_own_addr(net), -					 addr, peer_id, U16_MAX, -					 tipc_link_min_win(snd_l), -					 tipc_link_max_win(snd_l), -					 n->capabilities, -					 &n->bc_entry.inputq1, -					 &n->bc_entry.namedq, snd_l, -					 &n->bc_entry.link)) { -			pr_warn("Broadcast rcv link creation failed, no mem\n"); -			tipc_node_write_unlock_fast(n); -			tipc_node_put(n); -			return; -		} -	}  	le = &n->links[b->identity]; diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 17f8c523e33b..f1c3b8eb4b3d 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -502,6 +502,7 @@ static int tipc_sk_create(struct net *net, struct socket *sock,  	sock_init_data(sock, sk);  	tipc_set_sk_state(sk, TIPC_OPEN);  	if (tipc_sk_insert(tsk)) { +		sk_free(sk);  		pr_warn("Socket create failed; port number exhausted\n");  		return -EINVAL;  	} @@ -516,7 +517,7 @@ static int tipc_sk_create(struct net *net, struct socket *sock,  	timer_setup(&sk->sk_timer, tipc_sk_timeout, 0);  	sk->sk_shutdown = 0;  	sk->sk_backlog_rcv = tipc_sk_backlog_rcv; -	sk->sk_rcvbuf = sysctl_tipc_rmem[1]; +	sk->sk_rcvbuf = READ_ONCE(sysctl_tipc_rmem[1]);  	sk->sk_data_ready = tipc_data_ready;  	sk->sk_write_space = tipc_write_space;  	sk->sk_destruct = tipc_sock_destruct; |