aboutgitcodebugslistschat
diff options
context:
space:
mode:
authorLaurent Vivier <lvivier@redhat.com>2025-02-11 20:43:32 +0100
committerStefano Brivio <sbrivio@redhat.com>2025-02-12 19:44:25 +0100
commitdef7de4690ddb40f7c3b29e6ca81d30e9409fb5d (patch)
tree8942d07d7f13f4c170ebda541405f414b25b59f9
parent90f91fe72673e36c8e071a1750e9c03deb20ab0f (diff)
downloadpasst-def7de4690ddb40f7c3b29e6ca81d30e9409fb5d.tar
passt-def7de4690ddb40f7c3b29e6ca81d30e9409fb5d.tar.gz
passt-def7de4690ddb40f7c3b29e6ca81d30e9409fb5d.tar.bz2
passt-def7de4690ddb40f7c3b29e6ca81d30e9409fb5d.tar.lz
passt-def7de4690ddb40f7c3b29e6ca81d30e9409fb5d.tar.xz
passt-def7de4690ddb40f7c3b29e6ca81d30e9409fb5d.tar.zst
passt-def7de4690ddb40f7c3b29e6ca81d30e9409fb5d.zip
tcp_vu: Fix off-by one in header count array adjustment
head_cnt represents the number of frames we're going to forward to the guest in tcp_vu_sock_recv(), each of which could require multiple buffers ("elements"). We initialise it with as many frames as we can find space for in vu buffers, and we then need to adjust it down to the number of frames we actually (partially) filled. We adjust it down based on number of individual buffers used by the data from recvmsg(). At this point 'i' is *one greater than* that number of buffers, so we need to discard all (unused) frames with a buffer index >= i, instead of > i. Reported-by: David Gibson <david@gibson.dropbear.id.au> [david: Contributed actual commit message] Reviewed-by: David Gibson <david@gibson.dropbear.id.au> Signed-off-by: Stefano Brivio <sbrivio@redhat.com>
-rw-r--r--tcp_vu.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/tcp_vu.c b/tcp_vu.c
index fad7065..0622f17 100644
--- a/tcp_vu.c
+++ b/tcp_vu.c
@@ -261,7 +261,7 @@ static ssize_t tcp_vu_sock_recv(const struct ctx *c,
len -= iov->iov_len;
}
/* adjust head count */
- while (head_cnt > 0 && head[head_cnt - 1] > i)
+ while (head_cnt > 0 && head[head_cnt - 1] >= i)
head_cnt--;
/* mark end of array */
head[head_cnt] = i;