• Tung Nguyen's avatar
    tipc: fix duplicate SYN messages under link congestion · d34910e1
    Tung Nguyen authored
    Scenario:
    1. A client socket initiates a SYN message to a listening socket.
    2. The send link is congested, the SYN message is put in the
    send link and a wakeup message is put in wakeup queue.
    3. The congestion situation is abated, the wakeup message is
    pulled out of the wakeup queue. Function tipc_sk_push_backlog()
    is called to send out delayed messages by Nagle. However,
    the client socket is still in CONNECTING state. So, it sends
    the SYN message in the socket write queue to the listening socket
    again.
    4. The listening socket receives the first SYN message and creates
    first server socket. The client socket receives ACK- and establishes
    a connection to the first server socket. The client socket closes
    its connection with the first server socket.
    5. The listening socket receives the second SYN message and creates
    second server socket. The second server socket sends ACK- to the
    client socket, but it has been closed. It results in connection
    reset error when reading from the server socket in user space.
    
    Solution: return from function tipc_sk_push_backlog() immediately
    if there is pending SYN message in the socket write queue.
    
    Fixes: c0bceb97 ("tipc: add smart nagle feature")
    Signed-off-by: default avatarTung Nguyen <tung.q.nguyen@dektech.com.au>
    Acked-by: default avatarJon Maloy <jon.maloy@ericsson.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    d34910e1
socket.c 101 KB