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=E3Byenct; 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 BBE5E5A0282 for ; Mon, 02 Jun 2025 17:36:11 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1748878570; 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=vlb2IQx7G6snlZTFv+rohSPEcxVTBDXSboE9QjxyFmA=; b=E3Byenctw8Vgx8RUWbZhYWK7R5OT+P02+OJFiToVC8Uac3lhNhbpjfhcVOSJ7099hWJdH6 jXonEtgPLgHEBlppUfr3PnjJfe0ONSenEak9Gja1Gyq157cNmX/Q4lTnAAVv1JZHYuij+8 HFcK9ZXTkELQrMyEylaWo99ibdvwdjI= 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-624-qr2ylzZdMyW6nhxPDwCGuQ-1; Mon, 02 Jun 2025 11:36:09 -0400 X-MC-Unique: qr2ylzZdMyW6nhxPDwCGuQ-1 X-Mimecast-MFC-AGG-ID: qr2ylzZdMyW6nhxPDwCGuQ_1748878568 Received: by mail-wm1-f72.google.com with SMTP id 5b1f17b1804b1-442f90418b0so24290845e9.2 for ; Mon, 02 Jun 2025 08:36:09 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1748878568; x=1749483368; h=content-transfer-encoding:in-reply-to:autocrypt:from :content-language:references:cc:to:subject:user-agent:mime-version :date:message-id:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=vlb2IQx7G6snlZTFv+rohSPEcxVTBDXSboE9QjxyFmA=; b=WOm2A2xGdxz5kxRHkXJRXeRhsXQkM4rqopDLfyJMxm0IFJljI7Kle/fYBMbGbbriLy 86zaUVSh6ONrqFwYcQ6gZmdsLyy5xbexvePiwUyMpvNSkEwOxYgDGd//5ux/c66aDyQw utxo58P6bGK+ZUsoE+J3Ov1Gmjg35W/wNu3JAuZ85aqm15KhwQXnfWdQ1JI5oTE0KYLv bWmExB5AdrHvAG+IqfTES6/SYwBkFNTSQZcgqO4R1O0WYYxu2XOTVKyiztV+vNk94H5j jLOhZVBq++7KIFHTT9TBp30/h2Y8ucMi95J7tspTS3BN3fcdWvEyRC7wHl7lzYnUYHU0 08KQ== X-Gm-Message-State: AOJu0YzI/OC0sKITt6c7CDp9g/E8vgbqmHn0LYaugaNQvZwM4R2jcVL0 E1Kha8TYhzu+18g/xtvrx2qVE+um/9X0SaSCwIMh8KzIuBcZ6thFKGaYdLtQFkeESC2TF7Fyo6Y 01Zxnc4vBcjzrbsZGBIhHNrt5KjBwa8VqsJpIJumTTa/F6EybCQxK3w== X-Gm-Gg: ASbGncua9yArKTCZMVtvngcf3M1hI5cv0d2SgyQKXI+Nen6l6wwvKE1wNbGGOTyXNWY vVOHM8h8IJu/PWIPMWQNWTAh134tPuLqCzkHytEpb0xHz6hta+6SEsHFVv14X/kmYe3+dWMW0PV 3H6mPdSnIZfNL4PTr/T8X9VNIK+5ujSaq0qWkk/gdhnyWDFH8xp9JEq5ZJckVwzvAP3hxyB6ZYe PvcRxHu9Uj9wwkE+s/fqQwyhdxKi/dkrgrXv53R/7+2ZpTNNwjqIJEzmtIKKIPtN+mrUqwo2lgu e6NJfjRo8rEY/vRveQ17snSPar5chIQe5mBdVOn5dXPndB3MCoY= X-Received: by 2002:a05:600c:1d81:b0:442:e03b:589d with SMTP id 5b1f17b1804b1-4511edf2931mr70102445e9.24.1748878567861; Mon, 02 Jun 2025 08:36:07 -0700 (PDT) X-Google-Smtp-Source: AGHT+IEKTn3dnb8z9WHHYYsp5KISnp3kHKER4hnuRWtS0J+qdZMcf7c77a7fAMMZuQ8LsHVECU8YAw== X-Received: by 2002:a05:600c:1d81:b0:442:e03b:589d with SMTP id 5b1f17b1804b1-4511edf2931mr70102115e9.24.1748878567313; Mon, 02 Jun 2025 08:36:07 -0700 (PDT) Received: from ?IPV6:2a01:e0a:e10:ef90:343a:68f:2e91:95c? ([2a01:e0a:e10:ef90:343a:68f:2e91:95c]) by smtp.gmail.com with ESMTPSA id ffacd0b85a97d-3a4efe73ee0sm15181815f8f.46.2025.06.02.08.36.06 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Mon, 02 Jun 2025 08:36:06 -0700 (PDT) Message-ID: Date: Mon, 2 Jun 2025 17:36:06 +0200 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: [PATCH v5 03/29] iov: Update IOV_REMOVE_HEADER() and IOV_PEEK_HEADER() To: Stefano Brivio References: <20250417165136.2688884-1-lvivier@redhat.com> <20250417165136.2688884-4-lvivier@redhat.com> <20250526161918.6fface54@elisabeth> From: Laurent Vivier Autocrypt: addr=lvivier@redhat.com; keydata= xsFNBFYFJhkBEAC2me7w2+RizYOKZM+vZCx69GTewOwqzHrrHSG07MUAxJ6AY29/+HYf6EY2 WoeuLWDmXE7A3oJoIsRecD6BXHTb0OYS20lS608anr3B0xn5g0BX7es9Mw+hV/pL+63EOCVm SUVTEQwbGQN62guOKnJJJfphbbv82glIC/Ei4Ky8BwZkUuXd7d5NFJKC9/GDrbWdj75cDNQx UZ9XXbXEKY9MHX83Uy7JFoiFDMOVHn55HnncflUncO0zDzY7CxFeQFwYRbsCXOUL9yBtqLer Ky8/yjBskIlNrp0uQSt9LMoMsdSjYLYhvk1StsNPg74+s4u0Q6z45+l8RAsgLw5OLtTa+ePM JyS7OIGNYxAX6eZk1+91a6tnqfyPcMbduxyBaYXn94HUG162BeuyBkbNoIDkB7pCByed1A7q q9/FbuTDwgVGVLYthYSfTtN0Y60OgNkWCMtFwKxRaXt1WFA5ceqinN/XkgA+vf2Ch72zBkJL RBIhfOPFv5f2Hkkj0MvsUXpOWaOjatiu0fpPo6Hw14UEpywke1zN4NKubApQOlNKZZC4hu6/ 8pv2t4HRi7s0K88jQYBRPObjrN5+owtI51xMaYzvPitHQ2053LmgsOdN9EKOqZeHAYG2SmRW LOxYWKX14YkZI5j/TXfKlTpwSMvXho+efN4kgFvFmP6WT+tPnwARAQABzSNMYXVyZW50IFZp dmllciA8bHZpdmllckByZWRoYXQuY29tPsLBeAQTAQIAIgUCVgVQgAIbAwYLCQgHAwIGFQgC CQoLBBYCAwECHgECF4AACgkQ8ww4vT8vvjwpgg//fSGy0Rs/t8cPFuzoY1cex4limJQfReLr SJXCANg9NOWy/bFK5wunj+h/RCFxIFhZcyXveurkBwYikDPUrBoBRoOJY/BHK0iZo7/WQkur 6H5losVZtrotmKOGnP/lJYZ3H6OWvXzdz8LL5hb3TvGOP68K8Bn8UsIaZJoeiKhaNR0sOJyI YYbgFQPWMHfVwHD/U+/gqRhD7apVysxv5by/pKDln1I5v0cRRH6hd8M8oXgKhF2+rAOL7gvh jEHSSWKUlMjC7YwwjSZmUkL+TQyE18e2XBk85X8Da3FznrLiHZFHQ/NzETYxRjnOzD7/kOVy gKD/o7asyWQVU65mh/ECrtjfhtCBSYmIIVkopoLaVJ/kEbVJQegT2P6NgERC/31kmTF69vn8 uQyW11Hk8tyubicByL3/XVBrq4jZdJW3cePNJbTNaT0d/bjMg5zCWHbMErUib2Nellnbg6bc 2HLDe0NLVPuRZhHUHM9hO/JNnHfvgiRQDh6loNOUnm9Iw2YiVgZNnT4soUehMZ7au8PwSl4I KYE4ulJ8RRiydN7fES3IZWmOPlyskp1QMQBD/w16o+lEtY6HSFEzsK3o0vuBRBVp2WKnssVH qeeV01ZHw0bvWKjxVNOksP98eJfWLfV9l9e7s6TaAeySKRRubtJ+21PRuYAxKsaueBfUE7ZT 7zfOwU0EVgUmGQEQALxSQRbl/QOnmssVDxWhHM5TGxl7oLNJms2zmBpcmlrIsn8nNz0rRyxT 460k2niaTwowSRK8KWVDeAW6ZAaWiYjLlTunoKwvF8vP3JyWpBz0diTxL5o+xpvy/Q6YU3BN efdq8Vy3rFsxgW7mMSrI/CxJ667y8ot5DVugeS2NyHfmZlPGE0Nsy7hlebS4liisXOrN3jFz asKyUws3VXek4V65lHwB23BVzsnFMn/bw/rPliqXGcwl8CoJu8dSyrCcd1Ibs0/Inq9S9+t0 VmWiQWfQkz4rvEeTQkp/VfgZ6z98JRW7S6l6eophoWs0/ZyRfOm+QVSqRfFZdxdP2PlGeIFM C3fXJgygXJkFPyWkVElr76JTbtSHsGWbt6xUlYHKXWo+xf9WgtLeby3cfSkEchACrxDrQpj+ Jt/JFP+q997dybkyZ5IoHWuPkn7uZGBrKIHmBunTco1+cKSuRiSCYpBIXZMHCzPgVDjk4viP brV9NwRkmaOxVvye0vctJeWvJ6KA7NoAURplIGCqkCRwg0MmLrfoZnK/gRqVJ/f6adhU1oo6 z4p2/z3PemA0C0ANatgHgBb90cd16AUxpdEQmOCmdNnNJF/3Zt3inzF+NFzHoM5Vwq6rc1JP jfC3oqRLJzqAEHBDjQFlqNR3IFCIAo4SYQRBdAHBCzkM4rWyRhuVABEBAAHCwV8EGAECAAkF AlYFJhkCGwwACgkQ8ww4vT8vvjwg9w//VQrcnVg3TsjEybxDEUBm8dBmnKqcnTBFmxN5FFtI WlEuY8+YMiWRykd8Ln9RJ/98/ghABHz9TN8TRo2b6WimV64FmlVn17Ri6FgFU3xNt9TTEChq AcNg88eYryKsYpFwegGpwUlaUaaGh1m9OrTzcQy+klVfZWaVJ9Nw0keoGRGb8j4XjVpL8+2x OhXKrM1fzzb8JtAuSbuzZSQPDwQEI5CKKxp7zf76J21YeRrEW4WDznPyVcDTa+tz++q2S/Bp P4W98bXCBIuQgs2m+OflERv5c3Ojldp04/S4NEjXEYRWdiCxN7ca5iPml5gLtuvhJMSy36gl U6IW9kn30IWuSoBpTkgV7rLUEhh9Ms82VWW/h2TxL8enfx40PrfbDtWwqRID3WY8jLrjKfTd R3LW8BnUDNkG+c4FzvvGUs8AvuqxxyHbXAfDx9o/jXfPHVRmJVhSmd+hC3mcQ+4iX5bBPBPM oDqSoLt5w9GoQQ6gDVP2ZjTWqwSRMLzNr37rJjZ1pt0DCMMTbiYIUcrhX8eveCJtY7NGWNyx FCRkhxRuGcpwPmRVDwOl39MB3iTsRighiMnijkbLXiKoJ5CDVvX5yicNqYJPKh5MFXN1bvsB kmYiStMRbrD0HoY1kx5/VozBtc70OU0EB8Wrv9hZD+Ofp0T3KOr1RUHvCZoLURfFhSQ= In-Reply-To: <20250526161918.6fface54@elisabeth> X-Mimecast-Spam-Score: 0 X-Mimecast-MFC-PROC-ID: WTqXpobAbCDFEgUdbxh5eYR46NrOGBqkwjvsYNivjiA_1748878568 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: 37W44XDI7YSIH5QEUGDEQQJC6HQZYGEO X-Message-ID-Hash: 37W44XDI7YSIH5QEUGDEQQJC6HQZYGEO 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 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 26/05/2025 16:19, Stefano Brivio wrote: > On Thu, 17 Apr 2025 18:51:10 +0200 > Laurent Vivier wrote: > >> Provide a temporary variable of the wanted type to store >> the header if the memory in the iovec array is not contiguous. >> >> Signed-off-by: Laurent Vivier >> --- >> iov.c | 53 ++++++++++++++++++++++++++++++++++++++++++++--------- >> iov.h | 52 ++++++++++++++++++++++++++++++++++++++-------------- >> tcp_buf.c | 2 +- >> 3 files changed, 83 insertions(+), 24 deletions(-) >> >> diff --git a/iov.c b/iov.c >> index 047fcbce7fcd..907cd5339369 100644 >> --- a/iov.c >> +++ b/iov.c >> @@ -108,7 +108,7 @@ size_t iov_from_buf(const struct iovec *iov, size_t iov_cnt, >> * >> * Returns: The number of bytes successfully copied. >> */ >> -/* cppcheck-suppress unusedFunction */ >> +/* cppcheck-suppress [staticFunction] */ >> size_t iov_to_buf(const struct iovec *iov, size_t iov_cnt, >> size_t offset, void *buf, size_t bytes) >> { >> @@ -126,6 +126,7 @@ size_t iov_to_buf(const struct iovec *iov, size_t iov_cnt, >> /* copying data */ >> for (copied = 0; copied < bytes && i < iov_cnt; i++) { >> size_t len = MIN(iov[i].iov_len - offset, bytes - copied); >> + /* NOLINTNEXTLINE(clang-analyzer-core.NonNullParamChecker) */ >> memcpy((char *)buf + copied, (char *)iov[i].iov_base + offset, >> len); >> copied += len; >> @@ -260,7 +261,7 @@ bool iov_tail_drop(struct iov_tail *tail, size_t len) >> } >> >> /** >> - * iov_peek_header_() - Get pointer to a header from an IOV tail >> + * iov_check_header() - Check if a header can be accessed >> * @tail: IOV tail to get header from >> * @len: Length of header to get, in bytes >> * @align: Required alignment of header, in bytes >> @@ -271,8 +272,7 @@ bool iov_tail_drop(struct iov_tail *tail, size_t len) >> * overruns the IO vector, is not contiguous or doesn't have the >> * requested alignment. >> */ >> -/* cppcheck-suppress [staticFunction,unmatchedSuppression] */ >> -void *iov_peek_header_(struct iov_tail *tail, size_t len, size_t align) >> +static void *iov_check_header(struct iov_tail *tail, size_t len, size_t align) >> { >> char *p; >> >> @@ -292,27 +292,62 @@ void *iov_peek_header_(struct iov_tail *tail, size_t len, size_t align) >> return p; >> } >> >> +/** >> + * iov_peek_header_() - Get pointer to a header from an IOV tail >> + * @tail: IOV tail to get header from >> + * @v: Temporary memory to use if the memory in @tail >> + * is discontinuous >> + * @len: Length of header to get, in bytes >> + * @align: Required alignment of header, in bytes >> + * >> + * @tail may be pruned, but will represent the same bytes as before. >> + * >> + * Returns: Pointer to the first @len logical bytes of the tail, or to >> + * a copy if that overruns the IO vector, is not contiguous or >> + * doesn't have the requested alignment. NULL if that overruns the >> + * IO vector. >> + */ >> +/* cppcheck-suppress [staticFunction,unmatchedSuppression] */ >> +void *iov_peek_header_(struct iov_tail *tail, void *v, size_t len, size_t align) >> +{ >> + char *p = iov_check_header(tail, len, align); >> + size_t l; >> + >> + if (p) >> + return p; >> + >> + l = iov_to_buf(tail->iov, tail->cnt, tail->off, v, len); > > This effectively bypasses three checks performed by iov_check_header(), > that is, if there's nothing left in the iov_tail, if 'len' exceeds it, > or if it's not aligned, we'll proceed calling iov_to_buf(), whereas we > should only call it if the buffer is not contiguous, I think. > > Perhaps it would make more sense to fail on iov_check_header() failure, > and take the contiguity check out of it, so that we preserve the early > return on those failures. > > Another alternative might be to call iov_to_buf from the old version of > iov_peek_header_(), but I guess things would be easier to follow if > iov_check_header() really indicates failure, instead. I think it's correct to make a copy when it's not aligned (because it's related to the data position in memory, like to be not contiguous). The only real error case we must manage is if len exceeds the remaining size in the iov_tail: we check the return value iov_to_buf() for that. Thanks, Laurent