mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-12 00:38:55 +00:00
tipc: don't send FIN message from connectionless socket
In commit 6f00089c7372 ("tipc: remove SS_DISCONNECTING state") the check for socket type is in the wrong place, causing a closing socket to always send out a FIN message even when the socket was never connected. This is normally harmless, since the destination node for such messages most often is zero, and the message will be dropped, but it is still a wrong and confusing behavior. We fix this in this commit. Reviewed-by: Parthasarathy Bhuvaragan <parthasarathy.bhuvaragan@ericsson.com> Signed-off-by: Jon Maloy <jon.maloy@ericsson.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
e252536068
commit
693c56491f
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user