Fix vsock error-handling regression introduced in v6.17-rc1
Subsystems (5)
cover Fix vsock error-handling regression introduced in v6.17-rc1
Hi all,
Here are a couple of patches fixing the vsock error-handling regression found by syzbot [1] that I introduced during the recent merge window.
Cheers,
Will
[1] https://lore.kernel.org/all/[email protected]/
--->8
Will Deacon (2):
net: Introduce skb_copy_datagram_from_iter_full() vsock/virtio: Fix message iterator handling on transmit path
include/linux/skbuff.h | 2 ++ net/core/datagram.c | 14 ++++++++++++++ net/vmw_vsock/virtio_transport_common.c | 8 +++++--- 3 files changed, 21 insertions(+), 3 deletions(-)
Signature · 1 line
2.51.0.rc1.167.g924127e9c0-goog
PATCH 1/2 net: Introduce skb_copy_datagram_from_iter_full()
In a similar manner to copy_from_iter()/copy_from_iter_full(), introduce skb_copy_datagram_from_iter_full() which reverts the iterator to its initial state when returning an error.
A subsequent fix for a vsock regression will make use of this new function.
--- include/linux/skbuff.h | 2 ++ net/core/datagram.c | 14 ++++++++++++++ 2 files changed, 16 insertions(+)
include/linux/skbuff.h +2 -0
@@ -4172,6 +4172,8 @@ int skb_copy_and_crc32c_datagram_iter(const struct sk_buff *skb, int offset, struct iov_iter *to, int len, u32 *crcp);int skb_copy_datagram_from_iter (struct sk_buff *skb,int offset,struct iov_iter *from,int len); +int skb_copy_datagram_from_iter_full (struct sk_buff *skb,int offset, +struct iov_iter *from,int len);int zerocopy_sg_from_iter (struct sk_buff *skb,struct iov_iter *frm);void skb_free_datagram (struct sock *sk,struct sk_buff *skb);int skb_kill_datagram (struct sock *sk,struct sk_buff *skb,unsigned int flags);
net/core/datagram.c +14 -0
@@ -618,6 +618,20 @@ int skb_copy_datagram_from_iter(struct sk_buff *skb, int offset, }EXPORT_SYMBOL (skb_copy_datagram_from_iter); +int skb_copy_datagram_from_iter_full (struct sk_buff *skb,int offset, +struct iov_iter *from,int len) +{ +struct iov_iter_state state; +int ret; + +iov_iter_save_state (from, &state); + ret =skb_copy_datagram_from_iter (skb, offset, from, len); +if (ret) +iov_iter_restore (from, &state); +return ret; +} +EXPORT_SYMBOL (skb_copy_datagram_from_iter_full); +int zerocopy_fill_skb_from_iter (struct sk_buff *skb,struct iov_iter *from,size_t length) {
Signature · 1 line
2.51.0.rc1.167.g924127e9c0-goog
PATCH 2/2 vsock/virtio: Fix message iterator handling on transmit path
In reply to Will DeaconCommit 6693731487a8 ("vsock/virtio: Allocate nonlinear SKBs for handling large transmit buffers") converted the virtio vsock transmit path to utilise nonlinear SKBs when handling large buffers. As part of this change, virtio_transport_fill_skb() was updated to call skb_copy_datagram_from_iter() instead of memcpy_from_msg() as the latter expects a single destination buffer and cannot handle nonlinear SKBs correctly.
Unfortunately, during this conversion, I overlooked the error case when the copying function returns -EFAULT due to a fault on the input buffer in userspace. In this case, memcpy_from_msg() reverts the iterator to its initial state thanks to copy_from_iter_full() whereas skb_copy_datagram_from_iter() leaves the iterator partially advanced. This results in a WARN_ONCE() from the vsock code, which expects the iterator to stay in sync with the number of bytes transmitted so that virtio_transport_send_pkt_info() can return -EFAULT when it is called again:
------------[ cut here ]------------ 'send_pkt()' returns 0, but 65536 expected WARNING: CPU: 0 PID: 5503 at net/vmw_vsock/virtio_transport_common.c:428 virtio_transport_send_pkt_info+0xd11/0xf00 net/vmw_vsock/virtio_transport_common.c:426 Modules linked in: CPU: 0 UID: 0 PID: 5503 Comm: syz.0.17 Not tainted 6.16.0-syzkaller-12063-g37816488247d #0 PREEMPT(full) Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.3-debian-1.16.3-2~bpo12+1 04/01/2014
Call virtio_transport_fill_skb_full() to restore the previous iterator behaviour.
--- net/vmw_vsock/virtio_transport_common.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-)
net/vmw_vsock/virtio_transport_common.c +5 -3
@@ -105,12 +105,14 @@ static int virtio_transport_fill_skb(struct sk_buff *skb, size_t len, bool zcopy) { +struct msghdr *msg = info->msg; +if (zcopy) - return __zerocopy_sg_from_iter(info->msg, NULL, skb, - &info->msg->msg_iter, len, NULL); +return __zerocopy_sg_from_iter (msg,NULL , skb, + &msg->msg_iter, len,NULL );virtio_vsock_skb_put (skb, len); -return skb_copy_datagram_from_iter (skb,0 , &info->msg->msg_iter, len); +return skb_copy_datagram_from_iter_full (skb,0 , &msg->msg_iter, len); } static void virtio_transport_init_hdr(struct sk_buff *skb,
Signature · 1 line
2.51.0.rc1.167.g924127e9c0-goog
Quoted 10 lines · Will Deacon
Hi all,
Here are a couple of patches fixing the vsock error-handling regression found by syzbot [1] that I introduced during the recent merge window.
Cheers,
Will
Quoted 25 lines
Cc Alexander Viro <[email protected]>Cc Christian Brauner <[email protected]>Cc "David S. Miller" <[email protected]>Cc Eric Dumazet <[email protected]>Cc Hillf Danton <[email protected]>Cc Jakub Kicinski <[email protected]>Cc Jason Wang <[email protected]>Cc "Michael S. Tsirkin" <[email protected]>Cc Paolo Abeni <[email protected]>Cc Stefan Hajnoczi <[email protected]>Cc Stefano Garzarella <[email protected]>--->8
Will Deacon (2):
net: Introduceskb_copy_datagram_from_iter_full()vsock/virtio: Fix message iterator handling on transmit pathinclude/linux/skbuff.h | 2 ++ net/core/datagram.c | 14 ++++++++++++++ net/vmw_vsock/virtio_transport_common.c | 8 +++++--- 3 files changed, 21 insertions(+), 3 deletions(-)Signature · 1 line
2.51.0.rc1.167.g924127e9c0-goog
Quoted 25 lines · Will Deacon
Hi all,
Here are a couple of patches fixing the vsock error-handling regression found by syzbot [1] that I introduced during the recent merge window.
Cheers,
Will
[1] https://lore.kernel.org/all/[email protected]/
Cc Alexander Viro <[email protected]>Cc Christian Brauner <[email protected]>Cc "David S. Miller" <[email protected]>Cc Eric Dumazet <[email protected]>Cc Hillf Danton <[email protected]>Cc Jakub Kicinski <[email protected]>Cc Jason Wang <[email protected]>Cc "Michael S. Tsirkin" <[email protected]>Cc Paolo Abeni <[email protected]>Cc Stefan Hajnoczi <[email protected]>Cc Stefano Garzarella <[email protected]>--->8
Quoted 12 lines
Will Deacon (2):
net: Introduceskb_copy_datagram_from_iter_full()vsock/virtio: Fix message iterator handling on transmit pathinclude/linux/skbuff.h | 2 ++ net/core/datagram.c | 14 ++++++++++++++ net/vmw_vsock/virtio_transport_common.c | 8 +++++--- 3 files changed, 21 insertions(+), 3 deletions(-)Signature · 1 line
2.51.0.rc1.167.g924127e9c0-goog
Stefano Garzarella is offline at the moment and may not get a chance to review this for another week. In the meantime I have reviewed this patch series:
This series was applied to netdev/net.git (main) by Jakub Kicinski <[email protected]>:
Hello:
This series was applied to netdev/net.git (main)
by Jakub Kicinski <[email protected]>:
Quoted 8 lines · On Mon, 18 Aug 2025 19:03:53 +0100 you wrote:
Hi all,
Here are a couple of patches fixing the vsock error-handling regression found by syzbot [1] that I introduced during the recent merge window.
Cheers,
[...]
Here is the summary with links:
- [1/2] net: Introduce skb_copy_datagram_from_iter_full()
https://git.kernel.org/netdev/net/c/b08a784a5d14 - [2/2] vsock/virtio: Fix message iterator handling on transmit path https://git.kernel.org/netdev/net/c/7fb1291257ea
You are awesome, thank you!
Signature · 2 lines
Deet-doot-dot, I am a bot. https://korg.docs.kernel.org/patchwork/pwbot.html