net/x25: Fix null-ptr-deref caused by x25_disconnect
ANBZ: #1282 commit7781607938
upstream. 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:4becb7ee5b
("net/x25: Fix x25_neigh refcnt leak when x25 disconnect") Signed-off-by: Duoming Zhou <duoming@zju.edu.cn> Reviewed-by: Lin Ma <linma@zju.edu.cn> Signed-off-by: David S. Miller <davem@davemloft.net> Fixes: CVE-2022-1516 Signed-off-by: Shile Zhang <shile.zhang@linux.alibaba.com> Acked-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com> Acked-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com> Link: https://gitee.com/anolis/cloud-kernel/pulls/395
This commit is contained in:
parent
eba5307290
commit
4ea2588e0c
|
@ -1790,10 +1790,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 */
|
||||
|
|
Loading…
Reference in New Issue