• Paolo Abeni's avatar
    mptcp: fix race between MP_JOIN and close · 10f6d46c
    Paolo Abeni authored
    If a MP_JOIN subflow completes the 3whs while another
    CPU is closing the master msk, we can hit the
    following race:
    
    CPU1                                    CPU2
    
    close()
     mptcp_close
                                            subflow_syn_recv_sock
                                             mptcp_token_get_sock
                                             mptcp_finish_join
                                              inet_sk_state_load
      mptcp_token_destroy
      inet_sk_state_store(TCP_CLOSE)
      __mptcp_flush_join_list()
                                              mptcp_sock_graft
                                              list_add_tail
      sk_common_release
       sock_orphan()
     <socket free>
    
    The MP_JOIN socket will be leaked. Additionally we can hit
    UaF for the msk 'struct socket' referenced via the 'conn'
    field.
    
    This change try to address the issue introducing some
    synchronization between the MP_JOIN 3whs and mptcp_close
    via the join_list spinlock. If we detect the msk is closing
    the MP_JOIN socket is closed, too.
    
    Fixes: f296234c ("mptcp: Add handling of incoming MP_JOIN requests")
    Signed-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    Reviewed-by: default avatarMat Martineau <mathew.j.martineau@linux.intel.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    10f6d46c
protocol.c 48.9 KB