• Duoming Zhou's avatar
    net/x25: Fix null-ptr-deref caused by x25_disconnect · 77816079
    Duoming Zhou authored
    When the link layer is terminating, x25->neighbour will be set to NULL
    in x25_disconnect(). As a result, it could cause null-ptr-deref bugs in
    x25_sendmsg(),x25_recvmsg() and x25_connect(). One of the bugs is
    shown below.
    
        (Thread 1)                 |  (Thread 2)
    x25_link_terminated()          | x25_recvmsg()
     x25_kill_by_neigh()           |  ...
      x25_disconnect()             |  lock_sock(sk)
       ...                         |  ...
       x25->neighbour = NULL //(1) |
       ...                         |  x25->neighbour->extended //(2)
    
    The code sets NULL to x25->neighbour in position (1) and dereferences
    x25->neighbour in position (2), which could cause null-ptr-deref bug.
    
    This patch adds lock_sock() in x25_kill_by_neigh() in order to synchronize
    with x25_sendmsg(), x25_recvmsg() and x25_connect(). What`s more, the
    sock held by lock_sock() is not NULL, because it is extracted from x25_list
    and uses x25_list_lock to synchronize.
    
    Fixes: 4becb7ee ("net/x25: Fix x25_neigh refcnt leak when x25 disconnect")
    Signed-off-by: default avatarDuoming Zhou <duoming@zju.edu.cn>
    Reviewed-by: default avatarLin Ma <linma@zju.edu.cn>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    77816079
af_x25.c 40.2 KB