From: Junio C Hamano <gitster@pobox.com>
To: Simon Richter <Simon.Richter@hogyros.de>
Cc: Patrick Steinhardt <ps@pks.im>,
git@vger.kernel.org, Ben Knoble <ben.knoble@gmail.com>,
Jeff King <peff@peff.net>,
"brian m. carlson" <sandals@crustytoothpaste.net>,
"Randall S. Becker" <randall.becker@nexbridge.ca>,
Phillip Wood <phillip.wood@dunelm.org.uk>,
Johannes Schindelin <Johannes.Schindelin@gmx.de>
Subject: Re: [PATCH 1/5] compat/posix: introduce writev(3p) wrapper
Date: Thu, 16 Jul 2026 13:44:18 -0700 [thread overview]
Message-ID: <xmqqwluuekbh.fsf@gitster.g> (raw)
In-Reply-To: <xmqqfr1ig0hv.fsf@gitster.g> (Junio C. Hamano's message of "Thu, 16 Jul 2026 13:09:32 -0700")
Junio C Hamano <gitster@pobox.com> writes:
> Simon Richter <Simon.Richter@hogyros.de> writes:
>
>> Hi,
>>
>>> + if (iov[i].iov_len > maximum_signed_value_of_type(ssize_t) ||
>>> + iov[i].iov_len + sum > maximum_signed_value_of_type(ssize_t)) {
>>
>> That feels like it could overflow.
>
> Isn't it checking if it would overflow (and dying if so)?
>
> Ah, wait. The addition "(iov[i].iov_len + sum)" can indeed wrap
> around, and comparing it with the maximum value of ssize_t wouldn't
> catch that. Is that what you mean?
>
> Would something like this:
>
> if (maximum_signed_value_of_type(ssize_t) < iov[i].iov_len ||
> iov[i].iov_len + sum < iov[i].iov_len ||
> maximum_signed_value_of_type(ssize_t) < iov[i].iov_len + sum)
>
> work better to catch the three cases independently?
>
> (1) The value is already too large on its own.
> (2) Adding them together would cause an unsigned wrap-around.
> (3) The sum does not wrap around, but it exceeds the maximum
> representable value of ssize_t anyway.
Actually, looking at it again, I think the original code is safe
after all, because:
* "sum", even though it is a size_t, is checked inside the loop to
ensure it stays below the maximum value of ssize_t each time it
gets a new value.
* iov[i].iov_len is checked to ensure it does not exceed the
maximum value of ssize_t by the first part of the condition.
If both values are less than or equal to the maximum value of
ssize_t, their sum is at most twice that limit. For an N-bit
size_t, this sum is at most (2^N - 2), which can be computed safely
without any unsigned wrap-around.
So...?
next prev parent reply other threads:[~2026-07-16 20:44 UTC|newest]
Thread overview: 10+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-07-16 7:52 [PATCH 0/5] Reintroduce writev(3p) Patrick Steinhardt
2026-07-16 7:52 ` [PATCH 1/5] compat/posix: introduce writev(3p) wrapper Patrick Steinhardt
2026-07-16 8:47 ` Simon Richter
2026-07-16 20:09 ` Junio C Hamano
2026-07-16 20:44 ` Junio C Hamano [this message]
2026-07-16 7:52 ` [PATCH 2/5] wrapper: introduce writev(3p) wrappers Patrick Steinhardt
2026-07-16 7:52 ` [PATCH 3/5] wrapper: properly handle MAX_IO_SIZE in writev(3p) Patrick Steinhardt
2026-07-16 7:52 ` [PATCH 4/5] sideband: use writev(3p) to send pktlines Patrick Steinhardt
2026-07-16 7:52 ` [PATCH 5/5] fast-import: use writev(3p) to send cat-blob responses Patrick Steinhardt
2026-07-16 18:56 ` [PATCH 0/5] Reintroduce writev(3p) Johannes Sixt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=xmqqwluuekbh.fsf@gitster.g \
--to=gitster@pobox.com \
--cc=Johannes.Schindelin@gmx.de \
--cc=Simon.Richter@hogyros.de \
--cc=ben.knoble@gmail.com \
--cc=git@vger.kernel.org \
--cc=peff@peff.net \
--cc=phillip.wood@dunelm.org.uk \
--cc=ps@pks.im \
--cc=randall.becker@nexbridge.ca \
--cc=sandals@crustytoothpaste.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.