• Eric Dumazet's avatar
    udp: fix potential infinite loop in SO_REUSEPORT logic · ed0dfffd
    Eric Dumazet authored
    Using a combination of connected and un-connected sockets, Dmitry
    was able to trigger soft lockups with his fuzzer.
    
    The problem is that sockets in the SO_REUSEPORT array might have
    different scores.
    
    Right after sk2=socket(), setsockopt(sk2,...,SO_REUSEPORT, on) and
    bind(sk2, ...), but _before_ the connect(sk2) is done, sk2 is added into
    the soreuseport array, with a score which is smaller than the score of
    first socket sk1 found in hash table (I am speaking of the regular UDP
    hash table), if sk1 had the connect() done, giving a +8 to its score.
    
    hash bucket [X] -> sk1 -> sk2 -> NULL
    
    sk1 score = 14  (because it did a connect())
    sk2 score = 6
    
    SO_REUSEPORT fast selection is an optimization. If it turns out the
    score of the selected socket does not match score of first socket, just
    fallback to old SO_REUSEPORT logic instead of trying to be too smart.
    
    Normal SO_REUSEPORT users do not mix different kind of sockets, as this
    mechanism is used for load balance traffic.
    
    Fixes: e32ea7e7 ("soreuseport: fast reuseport UDP socket selection")
    Reported-by: default avatarDmitry Vyukov <dvyukov@google.com>
    Signed-off-by: default avatarEric Dumazet <edumazet@google.com>
    Cc: Craig Gallek <kraigatgoog@gmail.com>
    Acked-by: default avatarCraig Gallek <kraig@google.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    ed0dfffd
udp.c 67 KB