• Tuong Lien's avatar
    tipc: fix retrans failure due to wrong destination · abc9b4e0
    Tuong Lien authored
    When a user message is sent, TIPC will check if the socket has faced a
    congestion at link layer. If that happens, it will make a sleep to wait
    for the congestion to disappear. This leaves a gap for other users to
    take over the socket (e.g. multi threads) since the socket is released
    as well. Also, in case of connectionless (e.g. SOCK_RDM), user is free
    to send messages to various destinations (e.g. via 'sendto()'), then
    the socket's preformatted header has to be updated correspondingly
    prior to the actual payload message building.
    
    Unfortunately, the latter action is done before the first action which
    causes a condition issue that the destination of a certain message can
    be modified incorrectly in the middle, leading to wrong destination
    when that message is built. Consequently, when the message is sent to
    the link layer, it gets stuck there forever because the peer node will
    simply reject it. After a number of retransmission attempts, the link
    is eventually taken down and the retransmission failure is reported.
    
    This commit fixes the problem by rearranging the order of actions to
    prevent the race condition from occurring, so the message building is
    'atomic' and its header will not be modified by anyone.
    
    Fixes: 365ad353 ("tipc: reduce risk of user starvation during link congestion")
    Acked-by: default avatarJon Maloy <jon.maloy@ericsson.com>
    Signed-off-by: default avatarTuong Lien <tuong.t.lien@dektech.com.au>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    abc9b4e0
socket.c 101 KB