diff options
author | Laurent Vivier <lvivier@redhat.com> | 2025-02-11 20:43:32 +0100 |
---|---|---|
committer | Stefano Brivio <sbrivio@redhat.com> | 2025-02-12 19:44:25 +0100 |
commit | def7de4690ddb40f7c3b29e6ca81d30e9409fb5d (patch) | |
tree | 8942d07d7f13f4c170ebda541405f414b25b59f9 | |
parent | 90f91fe72673e36c8e071a1750e9c03deb20ab0f (diff) | |
download | passt-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.c | 2 |
1 files changed, 1 insertions, 1 deletions
@@ -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; |