Skip to content

Commit f6abafc

Browse files
stefano-garzarellaPaolo Abeni
authored and
Paolo Abeni
committed
vsock/bpf: return early if transport is not assigned
Some of the core functions can only be called if the transport has been assigned. As Michal reported, a socket might have the transport at NULL, for example after a failed connect(), causing the following trace: BUG: kernel NULL pointer dereference, address: 00000000000000a0 #PF: supervisor read access in kernel mode #PF: error_code(0x0000) - not-present page PGD 12faf8067 P4D 12faf8067 PUD 113670067 PMD 0 Oops: Oops: 0000 [#1] PREEMPT SMP NOPTI CPU: 15 UID: 0 PID: 1198 Comm: a.out Not tainted 6.13.0-rc2+ RIP: 0010:vsock_connectible_has_data+0x1f/0x40 Call Trace: vsock_bpf_recvmsg+0xca/0x5e0 sock_recvmsg+0xb9/0xc0 __sys_recvfrom+0xb3/0x130 __x64_sys_recvfrom+0x20/0x30 do_syscall_64+0x93/0x180 entry_SYSCALL_64_after_hwframe+0x76/0x7e So we need to check the `vsk->transport` in vsock_bpf_recvmsg(), especially for connected sockets (stream/seqpacket) as we already do in __vsock_connectible_recvmsg(). Fixes: 634f1a7 ("vsock: support sockmap") Cc: [email protected] Reported-by: Michal Luczaj <[email protected]> Closes: https://lore.kernel.org/netdev/[email protected]/ Tested-by: Michal Luczaj <[email protected]> Reported-by: [email protected] Closes: https://lore.kernel.org/netdev/[email protected]/ Tested-by: [email protected] Reviewed-by: Hyunwoo Kim <[email protected]> Acked-by: Michael S. Tsirkin <[email protected]> Reviewed-by: Luigi Leonardi <[email protected]> Signed-off-by: Stefano Garzarella <[email protected]> Signed-off-by: Paolo Abeni <[email protected]>
1 parent 2cb7c75 commit f6abafc

File tree

1 file changed

+9
-0
lines changed

1 file changed

+9
-0
lines changed

Diff for: net/vmw_vsock/vsock_bpf.c

+9
Original file line numberDiff line numberDiff line change
@@ -77,13 +77,21 @@ static int vsock_bpf_recvmsg(struct sock *sk, struct msghdr *msg,
7777
size_t len, int flags, int *addr_len)
7878
{
7979
struct sk_psock *psock;
80+
struct vsock_sock *vsk;
8081
int copied;
8182

8283
psock = sk_psock_get(sk);
8384
if (unlikely(!psock))
8485
return __vsock_recvmsg(sk, msg, len, flags);
8586

8687
lock_sock(sk);
88+
vsk = vsock_sk(sk);
89+
90+
if (!vsk->transport) {
91+
copied = -ENODEV;
92+
goto out;
93+
}
94+
8795
if (vsock_has_data(sk, psock) && sk_psock_queue_empty(psock)) {
8896
release_sock(sk);
8997
sk_psock_put(sk, psock);
@@ -108,6 +116,7 @@ static int vsock_bpf_recvmsg(struct sock *sk, struct msghdr *msg,
108116
copied = sk_msg_recvmsg(sk, psock, msg, len, flags);
109117
}
110118

119+
out:
111120
release_sock(sk);
112121
sk_psock_put(sk, psock);
113122

0 commit comments

Comments
 (0)