• Xin Long's avatar
    tipc: set con sock in tipc_conn_alloc · 0e5d56c6
    Xin Long authored
    A crash was reported by Wei Chen:
    
      BUG: kernel NULL pointer dereference, address: 0000000000000018
      RIP: 0010:tipc_conn_close+0x12/0x100
      Call Trace:
       tipc_topsrv_exit_net+0x139/0x320
       ops_exit_list.isra.9+0x49/0x80
       cleanup_net+0x31a/0x540
       process_one_work+0x3fa/0x9f0
       worker_thread+0x42/0x5c0
    
    It was caused by !con->sock in tipc_conn_close(). In tipc_topsrv_accept(),
    con is allocated in conn_idr then its sock is set:
    
      con = tipc_conn_alloc();
      ...                    <----[1]
      con->sock = newsock;
    
    If tipc_conn_close() is called in anytime of [1], the null-pointer-def
    is triggered by con->sock->sk due to con->sock is not yet set.
    
    This patch fixes it by moving the con->sock setting to tipc_conn_alloc()
    under s->idr_lock. So that con->sock can never be NULL when getting the
    con from s->conn_idr. It will be also safer to move con->server and flag
    CF_CONNECTED setting under s->idr_lock, as they should all be set before
    tipc_conn_alloc() is called.
    
    Fixes: c5fa7b3c ("tipc: introduce new TIPC server infrastructure")
    Reported-by: default avatarWei Chen <harperchen1110@gmail.com>
    Signed-off-by: default avatarXin Long <lucien.xin@gmail.com>
    Acked-by: default avatarJon Maloy <jmaloy@redhat.com>
    Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
    0e5d56c6
topsrv.c 18.4 KB