diff options
| author | Jon Maloy <jmaloy@redhat.com> | 2026-07-09 17:56:52 -0400 |
|---|---|---|
| committer | Stefano Brivio <sbrivio@redhat.com> | 2026-07-15 23:18:51 +0200 |
| commit | a3b9f86f39a7effc2d74833055c23bee54887894 (patch) | |
| tree | c6ac68f664b14337579242e6b877062aad0ad980 | |
| parent | 80cb5cf5a9b1b16a30c8ae4c47a87c8bfc91f20c (diff) | |
| download | passt-a3b9f86f39a7effc2d74833055c23bee54887894.tar passt-a3b9f86f39a7effc2d74833055c23bee54887894.tar.gz passt-a3b9f86f39a7effc2d74833055c23bee54887894.tar.bz2 passt-a3b9f86f39a7effc2d74833055c23bee54887894.tar.lz passt-a3b9f86f39a7effc2d74833055c23bee54887894.tar.xz passt-a3b9f86f39a7effc2d74833055c23bee54887894.tar.zst passt-a3b9f86f39a7effc2d74833055c23bee54887894.zip | |
udp_vu: Check iov_tail_clone() return before assigning to msg_iovlen
iov_tail_clone() returns ssize_t and can return -1 if the destination
iov array is too small. Its return value was assigned directly to
msg.msg_iovlen which is size_t, wrapping a negative value to a large
unsigned number passed to recvmsg().
Check for failure and return early, letting the caller rewind the
virtqueue.
Signed-off-by: Jon Maloy <jmaloy@redhat.com>
Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
| -rw-r--r-- | udp_vu.c | 8 |
1 files changed, 6 insertions, 2 deletions
@@ -67,11 +67,15 @@ static ssize_t udp_vu_sock_recv(struct iov_tail *payload, size_t *cnt, int s) struct iovec msg_iov[VIRTQUEUE_MAX_SIZE]; struct msghdr msg = { 0 }; size_t iov_used; + ssize_t iovlen; ssize_t dlen; + iovlen = iov_tail_clone(msg_iov, ARRAY_SIZE(msg_iov), payload); + if (iovlen < 0) + return -1; + msg.msg_iov = msg_iov; - msg.msg_iovlen = iov_tail_clone(msg.msg_iov, ARRAY_SIZE(msg_iov), - payload); + msg.msg_iovlen = iovlen; /* read data from the socket */ dlen = recvmsg(s, &msg, 0); |
