• Jiri Bohac's avatar
    ipx: fix locking regression in ipx_sendmsg and ipx_recvmsg · dbf8408b
    Jiri Bohac authored
    commit 01462405 upstream.
    
    This fixes an old regression introduced by commit
    b0d0d915 (ipx: remove the BKL).
    
    When a recvmsg syscall blocks waiting for new data, no data can be sent on the
    same socket with sendmsg because ipx_recvmsg() sleeps with the socket locked.
    
    This breaks mars-nwe (NetWare emulator):
    - the ncpserv process reads the request using recvmsg
    - ncpserv forks and spawns nwconn
    - ncpserv calls a (blocking) recvmsg and waits for new requests
    - nwconn deadlocks in sendmsg on the same socket
    
    Commit b0d0d915 has simply replaced BKL locking with
    lock_sock/release_sock. Unlike now, BKL got unlocked while
    sleeping, so a blocking recvmsg did not block a concurrent
    sendmsg.
    
    Only keep the socket locked while actually working with the socket data and
    release it prior to calling skb_recv_datagram().
    Signed-off-by: default avatarJiri Bohac <jbohac@suse.cz>
    Reviewed-by: default avatarArnd Bergmann <arnd@arndb.de>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    Signed-off-by: default avatarLuis Henriques <luis.henriques@canonical.com>
    dbf8408b
af_ipx.c 49.7 KB