From mboxrd@z Thu Jan 1 00:00:00 1970 Authentication-Results: passt.top; dmarc=pass (p=quarantine dis=none) header.from=redhat.com Authentication-Results: passt.top; dkim=pass (1024-bit key; unprotected) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=D6BcLb05; dkim-atps=neutral Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by passt.top (Postfix) with ESMTPS id 2AD3F5A0265 for ; Fri, 06 Mar 2026 09:17:39 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1772785057; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:autocrypt:autocrypt; bh=ik8eEZYbWtGrSf5SrY3BEbb/4zXmK89oUO93X5jDOjo=; b=D6BcLb05XZUZ7VjT4lPJgNcHdsV4/lHP2C1NStm6B1rODMy8myTA+7XzX24UgdmK+h/h3n Gu5fUTBOB8T6urqIzpOgQQ/SYEpSeFOLfydYV8aVIr3F/p/6Uo01V7rIvMaTQizzP1l2w6 OysOjWZO52YnXheSW00vx2EmbNflotY= Received: from mail-wm1-f72.google.com (mail-wm1-f72.google.com [209.85.128.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-606-ewWnVosLMbqMtftoHBBMkw-1; Fri, 06 Mar 2026 03:17:36 -0500 X-MC-Unique: ewWnVosLMbqMtftoHBBMkw-1 X-Mimecast-MFC-AGG-ID: ewWnVosLMbqMtftoHBBMkw_1772785055 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-4836c819456so68337165e9.3 for ; Fri, 06 Mar 2026 00:17:36 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1772785055; x=1773389855; h=content-transfer-encoding:in-reply-to:autocrypt:from :content-language:references:cc:to:subject:user-agent:mime-version :date:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=ik8eEZYbWtGrSf5SrY3BEbb/4zXmK89oUO93X5jDOjo=; b=WxoKDqLKBAJfl8sId7unmMxqjkpHTbqDBxyPJo5YV3jwry9QSlq2WuHqeU7JQjN4WC mq/xB0SlbuZcfmOdRApQSXY1/slLiB1ynM2y/RE/U6rEgfZGARJPb2Fx+v/NMGtMv0Vh NeDPWYuFnMtZYtfClqNa0P6Obm/2iwj+6qpKu7XMvVnafwQtlTH0xcmELCCQQsZ41Bbm sKS0URlUBHZSc59Xzn2lQtgqJrE/NLzfpiu5V1zp8CIt4DOiAt8lzKGos4QwDEHLWU0d ZaTn5e6RcB/VcP1+rdNkJ9yQQJ3/pJ5chwNn3Vr4P+V7RZPcFZrsFjYffzkPmzs9iP8N PB8A== X-Gm-Message-State: AOJu0YxuldkiKsb7goicrIOSTXPfinFsWzNfcTMO67ovMHv9Cz17dW9Y MbM0xsmypP26ldy9zEb7QzfDuurFEvBffkBSRp+qcWegLP0kGici8NnrNGLa36bh3CLHniAnAhs DCx0ZzvlT04QYkrQef+0Cy4paTU3cpBxNOF2OHOBf2QGG6obdyVdO9Q== X-Gm-Gg: ATEYQzwPTk8wIL3OS26rvpX7psRlSYnyiWQe6UGWVO3d4DK6X3a7AMllaYOsP7qMyDo 0SnduMQqx1S7TZc20dLMG5VHcJNN20yQK9W/0FpeC32au3NVlhi5EQ2/oSuVSIUH0lUr9mQlKA+ z3t1O7pEFeAzn+NLHMjpPkcqCa95v9TpPalnkd03LMjYNyMPrzVu6YXPmSs8hy2Bo53LzFnPwJ7 w3oTRpVJ5dHpsezRehBy7JhPLNtyaCEym5hsYzG51oiFSrD/QwMkc8HwMXSdGA8cX/KIFWClZN1 WD6+wNupAx8S/FQ/rY63PsqViFiIdcQXKSN4AZzMLks4b19kiBQ1pIxxN1Yo00cKlftdjpFzvMz 1ps1syQ/V0oK/OgSWRhKtLbVYyqkrZGmgPoNQfPfJ8qOTPyiBB/6wjOwiYQcbAZUVlg== X-Received: by 2002:a05:600c:3544:b0:47e:e2ec:9947 with SMTP id 5b1f17b1804b1-485269784e5mr17619025e9.33.1772785054905; Fri, 06 Mar 2026 00:17:34 -0800 (PST) X-Received: by 2002:a05:600c:3544:b0:47e:e2ec:9947 with SMTP id 5b1f17b1804b1-485269784e5mr17618485e9.33.1772785054385; Fri, 06 Mar 2026 00:17:34 -0800 (PST) Received: from ?IPV6:2a01:e0a:e10:ef90:4326:a36e:a7cb:624b? ([2a01:e0a:e10:ef90:4326:a36e:a7cb:624b]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4851fad2812sm166092315e9.1.2026.03.06.00.17.32 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Fri, 06 Mar 2026 00:17:33 -0800 (PST) Message-ID: Date: Fri, 6 Mar 2026 09:17:32 +0100 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v3] iov: Add iov_truncate() helper and use it in vu handlers To: Stefano Brivio References: <20260305125648.3720714-1-lvivier@redhat.com> <20260306083530.56648725@elisabeth> From: Laurent Vivier Autocrypt: addr=lvivier@redhat.com; keydata= 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 In-Reply-To: <20260306083530.56648725@elisabeth> X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: mswkQAdqSpvwMA13yd8dFJi2nBxmdW4JETHoGZNjl9M_1772785055 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Message-ID-Hash: PUN77JQVX3D5GAUF5E2CL4WA34MN4XPZ X-Message-ID-Hash: PUN77JQVX3D5GAUF5E2CL4WA34MN4XPZ X-MailFrom: lvivier@redhat.com X-Mailman-Rule-Misses: dmarc-mitigation; no-senders; approved; emergency; loop; banned-address; member-moderation; nonmember-moderation; administrivia; implicit-dest; max-recipients; max-size; news-moderation; no-subject; digests; suspicious-header CC: passt-dev@passt.top, David Gibson X-Mailman-Version: 3.3.8 Precedence: list List-Id: Development discussion and patches for passt Archived-At: Archived-At: List-Archive: List-Archive: List-Help: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: On 3/6/26 08:35, Stefano Brivio wrote: > On Thu, 5 Mar 2026 13:56:48 +0100 > Laurent Vivier wrote: > >> Add a generic iov_truncate() function that truncates an IO vector to a >> given number of bytes, returning the number of iov entries that contain >> data after truncation. >> >> Use it in udp_vu_sock_recv() and tcp_vu_sock_recv() to replace the >> open-coded truncation logic that adjusted iov entries after recvmsg(). >> Also convert the direct iov_len assignment in tcp_vu_send_flag() to use >> iov_truncate() for consistency. >> >> Signed-off-by: Laurent Vivier >> --- >> >> Notes: >> v3: use in tcp_vu_send_flag() too >> v2: use iov_truncate() in udp_vu_sock_recv() too >> >> iov.c | 22 ++++++++++++++++++++++ >> iov.h | 1 + >> tcp_vu.c | 14 +++----------- >> udp_vu.c | 12 +++--------- >> 4 files changed, 29 insertions(+), 20 deletions(-) >> >> diff --git a/iov.c b/iov.c >> index ad726daa4cd8..31a3f5bc29e5 100644 >> --- a/iov.c >> +++ b/iov.c >> @@ -147,6 +147,28 @@ size_t iov_size(const struct iovec *iov, size_t iov_cnt) >> return len; >> } >> >> +/** >> + * iov_truncate() - Truncate an IO vector to a given number of bytes >> + * @iov: IO vector (modified) >> + * @iov_cnt: Number of entries in @iov >> + * @size: Total number of bytes to keep >> + * >> + * Return: number of iov entries that contain data after truncation >> + */ >> +size_t iov_truncate(struct iovec *iov, size_t iov_cnt, size_t size) >> +{ >> + size_t i, offset; >> + >> + i = iov_skip_bytes(iov, iov_cnt, size, &offset); >> + >> + if (i < iov_cnt) { >> + iov[i].iov_len = offset; >> + i += !!offset; >> + } >> + >> + return i; >> +} >> + >> /** >> * iov_tail_prune() - Remove any unneeded buffers from an IOV tail >> * @tail: IO vector tail (modified) >> diff --git a/iov.h b/iov.h >> index d1ab91a94e22..b4e50b0fca5a 100644 >> --- a/iov.h >> +++ b/iov.h >> @@ -29,6 +29,7 @@ size_t iov_from_buf(const struct iovec *iov, size_t iov_cnt, >> size_t iov_to_buf(const struct iovec *iov, size_t iov_cnt, >> size_t offset, void *buf, size_t bytes); >> size_t iov_size(const struct iovec *iov, size_t iov_cnt); >> +size_t iov_truncate(struct iovec *iov, size_t iov_cnt, size_t size); >> >> /* >> * DOC: Theory of Operation, struct iov_tail >> diff --git a/tcp_vu.c b/tcp_vu.c >> index 88be232dca66..8ca4170f13f6 100644 >> --- a/tcp_vu.c >> +++ b/tcp_vu.c >> @@ -131,7 +131,7 @@ int tcp_vu_send_flag(const struct ctx *c, struct tcp_tap_conn *conn, int flags) >> return ret; >> } >> >> - flags_elem[0].in_sg[0].iov_len = hdrlen + optlen; >> + iov_truncate(&flags_iov[0], 1, hdrlen + optlen); >> payload = IOV_TAIL(flags_elem[0].in_sg, 1, hdrlen); >> >> if (flags & KEEPALIVE) >> @@ -192,9 +192,9 @@ static ssize_t tcp_vu_sock_recv(const struct ctx *c, struct vu_virtq *vq, >> struct msghdr mh_sock = { 0 }; >> uint16_t mss = MSS_GET(conn); >> int s = conn->sock; >> - ssize_t ret, len; >> size_t hdrlen; >> int elem_cnt; >> + ssize_t ret; >> int i; >> >> *iov_cnt = 0; >> @@ -247,15 +247,7 @@ static ssize_t tcp_vu_sock_recv(const struct ctx *c, struct vu_virtq *vq, >> ret -= already_sent; >> >> /* adjust iov number and length of the last iov */ >> - len = ret; >> - for (i = 0; len && i < elem_cnt; i++) { >> - struct iovec *iov = &elem[i].in_sg[0]; >> - >> - if (iov->iov_len > (size_t)len) >> - iov->iov_len = len; >> - >> - len -= iov->iov_len; >> - } >> + i = iov_truncate(&iov_vu[DISCARD_IOV_NUM], elem_cnt, ret); > > I had a quick look, but I couldn't figure this out. This causes > Coverity Scan to report: > > /home/sbrivio/passt/tcp_vu.c:457:3: > Type: Overflowed constant (INTEGER_OVERFLOW) > > /home/sbrivio/passt/tcp_vu.c:355:2: > 1. path: Condition "!vu_queue_enabled(vq)", taking false branch. > /home/sbrivio/passt/tcp_vu.c:355:2: > 2. path: Condition "!vu_queue_started(vq)", taking false branch. > /home/sbrivio/passt/tcp_vu.c:362:2: > 3. path: Condition "0U /* (uint32_t)0 */ - (uint32_t)already_sent - 1 < (16777216U /* 1 << 16 + 8 */)", taking false branch. > /home/sbrivio/passt/tcp_vu.c:374:2: > 4. path: Condition "!wnd_scaled", taking false branch. > /home/sbrivio/passt/tcp_vu.c:374:2: > 5. path: Condition "already_sent >= wnd_scaled", taking false branch. > /home/sbrivio/passt/tcp_vu.c:388:2: > 6. path: Condition "v6", taking true branch. > /home/sbrivio/passt/tcp_vu.c:390:2: > 7. path: Condition "len < 0", taking false branch. > /home/sbrivio/passt/tcp_vu.c:402:2: > 8. path: Condition "!len", taking false branch. > /home/sbrivio/passt/tcp_vu.c:425:2: > 9. path: Condition "log_trace", taking true branch. > /home/sbrivio/passt/tcp_vu.c:426:2: > 10. path: Condition "log_trace", taking true branch. > /home/sbrivio/passt/tcp_vu.c:439:2: > 11. path: Condition "v6", taking true branch. > /home/sbrivio/passt/tcp_vu.c:439:2: > 12. function_return: Function "tcp_vu_hdrlen(v6)" returns 86. > /home/sbrivio/passt/tcp_vu.c:439:2: > 13. known_value_assign: "hdrlen" = "tcp_vu_hdrlen(v6)", its value is now 86. > /home/sbrivio/passt/tcp_vu.c:440:2: > 14. path: Condition "i < head_cnt", taking true branch. > /home/sbrivio/passt/tcp_vu.c:443:3: > 15. function_return: Function "iov_size(iov, buf_cnt)" returns 0. > /home/sbrivio/passt/tcp_vu.c:443:3: > 16. known_value_assign: "dlen" = "iov_size(iov, buf_cnt) - hdrlen", its value is now 18446744073709551530. > /home/sbrivio/passt/tcp_vu.c:450:3: > 17. path: Condition "previous_dlen != dlen", taking true branch. > /home/sbrivio/passt/tcp_vu.c:454:3: > 18. path: Condition "!*c->pcap", taking false branch. > /home/sbrivio/passt/tcp_vu.c:457:3: > 19. overflow_const: Expression "dlen + hdrlen", where "dlen" is known to be equal to -86, and "hdrlen" is known to be equal to 86, underflows the type of "dlen + hdrlen", which is type "unsigned long". > if iov_size(iov, buf_cnt) = 0 and hdrlen = 86 (all unsigned) "dlen" = "iov_size(iov, buf_cnt) - hdrlen", its value is now 18446744073709551530 (see 16.) (i.e. -hdrlen, unsigned -86) so "dlen + hdrlen" overflows (I guess). Try: diff --git a/tcp_vu.c b/tcp_vu.c index 8ca4170f13f6..787ee004a66a 100644 --- a/tcp_vu.c +++ b/tcp_vu.c @@ -440,7 +440,7 @@ int tcp_vu_data_from_sock(const struct ctx *c, struct tcp_tap_conn *conn) for (i = 0, previous_dlen = -1, check = NULL; i < head_cnt; i++) { struct iovec *iov = &elem[head[i]].in_sg[0]; int buf_cnt = head[i + 1] - head[i]; - ssize_t dlen = iov_size(iov, buf_cnt) - hdrlen; + ssize_t dlen = (ssize_t)iov_size(iov, buf_cnt) - hdrlen; bool push = i == head_cnt - 1; size_t l2len; Thanks, Laurent