Re: [PATCH 1/5] ref-cache: use 'size_t' instead of int for length
- From
Junio C Hamano <gitster@pobox.com>
- Date
- Jul 24, 2025, 17:17 UTC
- Message-ID
- <xmqq7bzxik3f.fsf@gitster.g>
- In-Reply-To
- <20250724-kn-small-cleanups-v1-1-0c70f591de3e@gmail.com>
Karthik Nayak <karthik.188@gmail.com> writes:
Show 40 quoted lines
> The commit 090eb5336c (refs: selectively set prefix in the seek
> functions, 2025-07-15) modified the ref-cache iterator to support
> seeking to a specified marker without setting the prefix.
>
> The commit adds and uses an integer 'len' to capture the length of the
> seek marker to compare with the entries of a given directory. Since the
> type of the variable is 'int', this is met with a typecast of converting
> a `strlen` to 'int' so it can be assigned to the 'len' variable.
>
> This is whole operation is a bit wrong:
> 1. Since the 'len' variable is eventually used in a 'strncmp', it should
> have been of type 'size_t'.
> 2. This also truncates the value provided from 'strlen' to an int, which
> could cause a large refname to produce a negative number.
>
> Let's do the correct thing here and simply use 'size_t' for `len`.
>
> Signed-off-by: Karthik Nayak <karthik.188@gmail.com>
> ---
> refs/ref-cache.c | 5 +++--
> 1 file changed, 3 insertions(+), 2 deletions(-)
>
> diff --git a/refs/ref-cache.c b/refs/ref-cache.c
> index 1d95b56d40..8df7ae43e5 100644
> --- a/refs/ref-cache.c
> +++ b/refs/ref-cache.c
> @@ -498,13 +498,14 @@ static int cache_ref_iterator_seek(struct ref_iterator *ref_iterator,
> * indexing to each level as needed.
> */
> do {
> - int len, idx;
> + int idx;
> + size_t len;
> int cmp = 0;
>
> sort_ref_dir(dir);
>
> slash = strchr(slash, '/');
> - len = slash ? slash - refname : (int)strlen(refname);
> + len = slash ? (size_t)(slash - refname) : strlen(refname);The "strlen()" side is good, but was there recently a discussion on how to safely convert (slash - refname) that is ptrdiff_t to size_t?
My archive search found a rather old ptrdiff_to_size() proposal https://lore.kernel.org/git/20241227213729.GA796141@coredump.intra.peff.net/ but I thought there were another discussion thread about casting to size_t recently.
I _think_ a vanilla cast is safe here, as slash sits always right to refname (if not NULL, that is), and the difference should fit within size_t (because the difference is smaller than the size of the memory block pointed at by slash).
So in short, this looks good. Will queue.