Skip to content

Commit 4cd12c6

Browse files
Shigeru Yoshidaborkmann
Shigeru Yoshida
authored andcommitted
bpf, sockmap: Fix NULL pointer dereference in sk_psock_verdict_data_ready()
syzbot reported the following NULL pointer dereference issue [1]: BUG: kernel NULL pointer dereference, address: 0000000000000000 [...] RIP: 0010:0x0 [...] Call Trace: <TASK> sk_psock_verdict_data_ready+0x232/0x340 net/core/skmsg.c:1230 unix_stream_sendmsg+0x9b4/0x1230 net/unix/af_unix.c:2293 sock_sendmsg_nosec net/socket.c:730 [inline] __sock_sendmsg+0x221/0x270 net/socket.c:745 ____sys_sendmsg+0x525/0x7d0 net/socket.c:2584 ___sys_sendmsg net/socket.c:2638 [inline] __sys_sendmsg+0x2b0/0x3a0 net/socket.c:2667 do_syscall_64+0xf9/0x240 entry_SYSCALL_64_after_hwframe+0x6f/0x77 If sk_psock_verdict_data_ready() and sk_psock_stop_verdict() are called concurrently, psock->saved_data_ready can be NULL, causing the above issue. This patch fixes this issue by calling the appropriate data ready function using the sk_psock_data_ready() helper and protecting it from concurrency with sk->sk_callback_lock. Fixes: 6df7f76 ("bpf, sockmap: Wake up polling after data copy") Reported-by: [email protected] Signed-off-by: Shigeru Yoshida <[email protected]> Signed-off-by: Daniel Borkmann <[email protected]> Tested-by: [email protected] Acked-by: John Fastabend <[email protected]> Closes: https://syzkaller.appspot.com/bug?extid=fd7b34375c1c8ce29c93 [1] Link: https://lore.kernel.org/bpf/[email protected]
1 parent 5c138a8 commit 4cd12c6

File tree

1 file changed

+5
-2
lines changed

1 file changed

+5
-2
lines changed

net/core/skmsg.c

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,8 +1226,11 @@ static void sk_psock_verdict_data_ready(struct sock *sk)
12261226

12271227
rcu_read_lock();
12281228
psock = sk_psock(sk);
1229-
if (psock)
1230-
psock->saved_data_ready(sk);
1229+
if (psock) {
1230+
read_lock_bh(&sk->sk_callback_lock);
1231+
sk_psock_data_ready(sk, psock);
1232+
read_unlock_bh(&sk->sk_callback_lock);
1233+
}
12311234
rcu_read_unlock();
12321235
}
12331236
}

0 commit comments

Comments
 (0)