android_kernel_xiaomi_sm7250/net/x25
Duoming Zhou 4c240c5a10 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@zju.edu.cn>
Reviewed-by: Lin Ma <linma@zju.edu.cn>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Sasha Levin <sashal@kernel.org>
2022-04-15 14:14:53 +02:00
..
af_x25.c net/x25: Fix null-ptr-deref caused by x25_disconnect 2022-04-15 14:14:53 +02:00
Kconfig x25: remove blank lines at EOF 2018-07-24 14:10:42 -07:00
Makefile License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
sysctl_net_x25.c License cleanup: add SPDX GPL-2.0 license identifier to files with no license 2017-11-02 11:10:55 +01:00
x25_dev.c net/x25: Fix x25_neigh refcnt leak when receiving frame 2020-04-29 16:31:21 +02:00
x25_facilities.c net: x25: mark expected switch fall-throughs 2017-10-22 03:08:46 +01:00
x25_forward.c x25: convert printks to pr_<level> 2013-12-09 20:24:18 -05:00
x25_in.c net: x25: mark expected switch fall-throughs 2017-10-22 03:08:46 +01:00
x25_link.c treewide: setup_timer() -> timer_setup() 2017-11-21 15:57:07 -08:00
x25_out.c x25: remove the BKL 2011-03-05 10:55:45 +01:00
x25_proc.c proc: introduce proc_create_seq{,_data} 2018-05-16 07:23:35 +02:00
x25_route.c net, x25: convert x25_route.refcnt from atomic_t to refcount_t 2017-07-04 22:35:18 +01:00
x25_subr.c net/x25: Fix null-ptr-deref in x25_disconnect 2020-08-05 10:06:02 +02:00
x25_timer.c treewide: Remove TIMER_FUNC_TYPE and TIMER_DATA_TYPE casts 2017-11-21 16:35:54 -08:00