aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorJon Maloy <jmaloy@redhat.com>2026-07-09 17:56:52 -0400
committerStefano Brivio <sbrivio@redhat.com>2026-07-15 23:18:51 +0200
commita3b9f86f39a7effc2d74833055c23bee54887894 (patch)
treec6ac68f664b14337579242e6b877062aad0ad980
parent80cb5cf5a9b1b16a30c8ae4c47a87c8bfc91f20c (diff)
downloadpasst-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.c8
1 files changed, 6 insertions, 2 deletions
diff --git a/udp_vu.c b/udp_vu.c
index e4fb105..edd9cae 100644
--- a/udp_vu.c
+++ b/udp_vu.c
@@ -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);