• Paolo Abeni's avatar
    mptcp: fix infinite loop on recvmsg()/worker() race. · d9fb8c50
    Paolo Abeni authored
    If recvmsg() and the workqueue race to dequeue the data
    pending on some subflow, the current mapping for such
    subflow covers several skbs and some of them have not
    reached yet the received, either the worker or recvmsg()
    can find a subflow with the data_avail flag set - since
    the current mapping is valid and in sequence - but no
    skbs in the receive queue - since the other entity just
    processed them.
    
    The above will lead to an unbounded loop in __mptcp_move_skbs()
    and a subsequent hang of any task trying to acquiring the msk
    socket lock.
    
    This change addresses the issue stopping the __mptcp_move_skbs()
    loop as soon as we detect the above race (empty receive queue
    with data_avail set).
    
    Reported-and-tested-by: syzbot+fcf8ca5817d6e92c6567@syzkaller.appspotmail.com
    Fixes: ab174ad8 ("mptcp: move ooo skbs into msk out of order queue.")
    Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    Reviewed-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    d9fb8c50
protocol.c 69 KB