• Duoming Zhou's avatar
    net/x25: Fix null-ptr-deref caused by x25_disconnect · 5c94b620
    Duoming Zhou authored
    [ Upstream commit 77816079 ]
    
    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 u...
    5c94b620
af_x25.c 40.4 KB