Patch "net/x25: Fix null-ptr-deref caused by x25_disconnect" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net/x25: Fix null-ptr-deref caused by x25_disconnect

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-x25-fix-null-ptr-deref-caused-by-x25_disconnect.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit a79aeab25dbf90920bb172cb9de97140608f5a8c
Author: Duoming Zhou <duoming@xxxxxxxxxx>
Date:   Sat Mar 26 18:43:46 2022 +0800

    net/x25: Fix null-ptr-deref caused by x25_disconnect
    
    [ Upstream commit 7781607938c8371d4c2b243527430241c62e39c2 ]
    
    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: 4becb7ee5b3d ("net/x25: Fix x25_neigh refcnt leak when x25 disconnect")
    Signed-off-by: Duoming Zhou <duoming@xxxxxxxxxx>
    Reviewed-by: Lin Ma <linma@xxxxxxxxxx>
    Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/net/x25/af_x25.c b/net/x25/af_x25.c
index 3583354a7d7f..3a171828638b 100644
--- a/net/x25/af_x25.c
+++ b/net/x25/af_x25.c
@@ -1765,10 +1765,15 @@ void x25_kill_by_neigh(struct x25_neigh *nb)
 
 	write_lock_bh(&x25_list_lock);
 
-	sk_for_each(s, &x25_list)
-		if (x25_sk(s)->neighbour == nb)
+	sk_for_each(s, &x25_list) {
+		if (x25_sk(s)->neighbour == nb) {
+			write_unlock_bh(&x25_list_lock);
+			lock_sock(s);
 			x25_disconnect(s, ENETUNREACH, 0, 0);
-
+			release_sock(s);
+			write_lock_bh(&x25_list_lock);
+		}
+	}
 	write_unlock_bh(&x25_list_lock);
 
 	/* Remove any related forwards */



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux