• Florian Westphal's avatar
    mptcp: fix tcp fallback crash · 0b4f33de
    Florian Westphal authored
    Christoph Paasch reports following crash:
    
    general protection fault [..]
    CPU: 0 PID: 2874 Comm: syz-executor072 Not tainted 5.6.0-rc5 #62
    RIP: 0010:__pv_queued_spin_lock_slowpath kernel/locking/qspinlock.c:471
    [..]
     queued_spin_lock_slowpath arch/x86/include/asm/qspinlock.h:50 [inline]
     do_raw_spin_lock include/linux/spinlock.h:181 [inline]
     spin_lock_bh include/linux/spinlock.h:343 [inline]
     __mptcp_flush_join_list+0x44/0xb0 net/mptcp/protocol.c:278
     mptcp_shutdown+0xb3/0x230 net/mptcp/protocol.c:1882
    [..]
    
    Problem is that mptcp_shutdown() socket isn't an mptcp socket,
    its a plain tcp_sk.  Thus, trying to access mptcp_sk specific
    members accesses garbage.
    
    Root cause is that accept() returns a fallback (tcp) socket, not an mptcp
    one.  There is code in getpeername to detect this and override the sockets
    stream_ops.  But this will only run when accept() caller provided a
    sockaddr struct.  "accept(fd, NULL, 0)" will therefore result in
    mptcp stream ops, but with sock->sk pointing at a tcp_sk.
    
    Update the existing fallback handling to detect this as well.
    
    Moreover, mptcp_shutdown did not have fallback handling, and
    mptcp_poll did it too late so add that there as well.
    Reported-by: default avatarChristoph Paasch <cpaasch@apple.com>
    Tested-by: default avatarChristoph Paasch <cpaasch@apple.com>
    Reviewed-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
    Signed-off-by: default avatarMatthieu Baerts <matthieu.baerts@tessares.net>
    Signed-off-by: default avatarFlorian Westphal <fw@strlen.de>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    0b4f33de
protocol.c 46.1 KB