On 12/21/2016 09:40 PM, Jon Maloy wrote:
> 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.
>
Shouldn't this be sent to "net" instead as we are in merge window and 
let this be applied early?
Please add fixes tag:
Fixes: 6f00089c7372 ("tipc: remove SS_DISCONNECTING state")
> Signed-off-by: Jon Maloy <jon.ma...@ericsson.com>
Reviewed-by: Parthasarathy Bhuvaragan 
<parthasarathy.bhuvara...@ericsson.com>

/Partha
> ---
>  net/tipc/socket.c | 24 +++++++++++++-----------
>  1 file changed, 13 insertions(+), 11 deletions(-)
>
> diff --git a/net/tipc/socket.c b/net/tipc/socket.c
> index 333c5da..800caaa 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);
>       }
>  }
>
>

------------------------------------------------------------------------------
Developer Access Program for Intel Xeon Phi Processors
Access to Intel Xeon Phi processor-based developer platforms.
With one year of Intel Parallel Studio XE.
Training and support from Colfax.
Order your platform today.http://sdm.link/intel
_______________________________________________
tipc-discussion mailing list
tipc-discussion@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/tipc-discussion

Reply via email to