diff options
Diffstat (limited to 'net/tipc')
| -rw-r--r-- | net/tipc/msg.c | 4 | ||||
| -rw-r--r-- | net/tipc/socket.c | 24 | 
2 files changed, 15 insertions, 13 deletions
| diff --git a/net/tipc/msg.c b/net/tipc/msg.c index 17201aa8423d..a22be502f1bd 100644 --- a/net/tipc/msg.c +++ b/net/tipc/msg.c @@ -268,7 +268,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m,  		__skb_queue_tail(list, skb);  		skb_copy_to_linear_data(skb, mhdr, mhsz);  		pktpos = skb->data + mhsz; -		if (copy_from_iter(pktpos, dsz, &m->msg_iter) == dsz) +		if (copy_from_iter_full(pktpos, dsz, &m->msg_iter))  			return dsz;  		rc = -EFAULT;  		goto error; @@ -299,7 +299,7 @@ int tipc_msg_build(struct tipc_msg *mhdr, struct msghdr *m,  		if (drem < pktrem)  			pktrem = drem; -		if (copy_from_iter(pktpos, pktrem, &m->msg_iter) != pktrem) { +		if (!copy_from_iter_full(pktpos, pktrem, &m->msg_iter)) {  			rc = -EFAULT;  			goto error;  		} diff --git a/net/tipc/socket.c b/net/tipc/socket.c index 333c5dae0072..800caaa699a1 100644 --- a/net/tipc/socket.c +++ b/net/tipc/socket.c @@ -441,15 +441,19 @@ static void __tipc_shutdown(struct socket *sock, int error)  	while ((skb = __skb_dequeue(&sk->sk_receive_queue)) != NULL) {  		if (TIPC_SKB_CB(skb)->bytes_read) {  			kfree_skb(skb); -		} else { -			if (!tipc_sk_type_connectionless(sk) && -			    sk->sk_state != TIPC_DISCONNECTING) { -				tipc_set_sk_state(sk, TIPC_DISCONNECTING); -				tipc_node_remove_conn(net, dnode, tsk->portid); -			} -			tipc_sk_respond(sk, skb, error); +			continue; +		} +		if (!tipc_sk_type_connectionless(sk) && +		    sk->sk_state != TIPC_DISCONNECTING) { +			tipc_set_sk_state(sk, TIPC_DISCONNECTING); +			tipc_node_remove_conn(net, dnode, tsk->portid);  		} +		tipc_sk_respond(sk, skb, error);  	} + +	if (tipc_sk_type_connectionless(sk)) +		return; +  	if (sk->sk_state != TIPC_DISCONNECTING) {  		skb = tipc_msg_create(TIPC_CRITICAL_IMPORTANCE,  				      TIPC_CONN_MSG, SHORT_H_SIZE, 0, dnode, @@ -457,10 +461,8 @@ static void __tipc_shutdown(struct socket *sock, int error)  				      tsk->portid, error);  		if (skb)  			tipc_node_xmit_skb(net, skb, dnode, tsk->portid); -		if (!tipc_sk_type_connectionless(sk)) { -			tipc_node_remove_conn(net, dnode, tsk->portid); -			tipc_set_sk_state(sk, TIPC_DISCONNECTING); -		} +		tipc_node_remove_conn(net, dnode, tsk->portid); +		tipc_set_sk_state(sk, TIPC_DISCONNECTING);  	}  } |