Skip to content

Commit f7e4367

Browse files
congwangdavem330
authored andcommitted
llc: hold llc_sap before release_sock()
syzbot reported we still access llc->sap in llc_backlog_rcv() after it is freed in llc_sap_remove_socket(): Call Trace: __dump_stack lib/dump_stack.c:77 [inline] dump_stack+0x1b9/0x294 lib/dump_stack.c:113 print_address_description+0x6c/0x20b mm/kasan/report.c:256 kasan_report_error mm/kasan/report.c:354 [inline] kasan_report.cold.7+0x242/0x2fe mm/kasan/report.c:412 __asan_report_load1_noabort+0x14/0x20 mm/kasan/report.c:430 llc_conn_ac_send_sabme_cmd_p_set_x+0x3a8/0x460 net/llc/llc_c_ac.c:785 llc_exec_conn_trans_actions net/llc/llc_conn.c:475 [inline] llc_conn_service net/llc/llc_conn.c:400 [inline] llc_conn_state_process+0x4e1/0x13a0 net/llc/llc_conn.c:75 llc_backlog_rcv+0x195/0x1e0 net/llc/llc_conn.c:891 sk_backlog_rcv include/net/sock.h:909 [inline] __release_sock+0x12f/0x3a0 net/core/sock.c:2335 release_sock+0xa4/0x2b0 net/core/sock.c:2850 llc_ui_release+0xc8/0x220 net/llc/af_llc.c:204 llc->sap is refcount'ed and llc_sap_remove_socket() is paired with llc_sap_add_socket(). This can be amended by holding its refcount before llc_sap_remove_socket() and releasing it after release_sock(). Reported-by: <[email protected]> Signed-off-by: Cong Wang <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 02b94fc commit f7e4367

File tree

1 file changed

+7
-0
lines changed

1 file changed

+7
-0
lines changed

net/llc/af_llc.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,6 +189,7 @@ static int llc_ui_release(struct socket *sock)
189189
{
190190
struct sock *sk = sock->sk;
191191
struct llc_sock *llc;
192+
struct llc_sap *sap;
192193

193194
if (unlikely(sk == NULL))
194195
goto out;
@@ -199,9 +200,15 @@ static int llc_ui_release(struct socket *sock)
199200
llc->laddr.lsap, llc->daddr.lsap);
200201
if (!llc_send_disc(sk))
201202
llc_ui_wait_for_disc(sk, sk->sk_rcvtimeo);
203+
sap = llc->sap;
204+
/* Hold this for release_sock(), so that llc_backlog_rcv() could still
205+
* use it.
206+
*/
207+
llc_sap_hold(sap);
202208
if (!sock_flag(sk, SOCK_ZAPPED))
203209
llc_sap_remove_socket(llc->sap, sk);
204210
release_sock(sk);
211+
llc_sap_put(sap);
205212
if (llc->dev)
206213
dev_put(llc->dev);
207214
sock_put(sk);

0 commit comments

Comments
 (0)