git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 2/3] diff: use size_t for the size passed to count_lines()

From
PWPhillip Wood <phillip.wood123@gmail.com>
Date
Nov 4, 2026, 15:45 UTC
Message-ID
<0b3f8998-bb3d-4a91-822d-291562691a6f@gmail.com>
In-Reply-To
<0cb42395-3e62-42e0-bfd3-a4265ed7cc33@gmail.com>
On 04/11/2026 13:58, Phillip Wood wrote:
Show 15 quoted lines
> On 01/11/2026 15:36, Elia Pinto wrote:
>> count_lines() takes the size as an "int", whereas callers have "unsigned
>> long" or "size_t". It is used for the diffstat of complete rewrites
>> ("git diff -B --stat") and in emit_rewrite_diff().
>>
>> With a file of 2GiB or more, the "int" becomes negative (or truncated
>> above 4GiB), leading to an incorrect line count. This only affects the
>> diffstat output, with no memory access issues.
>>
>> This was verified using a 16-bit simulation, where "git diff -B --stat"
>> reported 0 changed lines instead of the actual count.
>>
>  > Make the size parameter a size_t. The line counter remains "int".
> > That means the counter is subject to overflow as a file can contain as > many lines as its size.
> > I don't know what the simulation entailed, but this patch changes the > return type without changing either the type of the returned value which > can now overflow, or the types where the return values is stored by > callers.
Sorry I seem to have misread the patch when I wrote that - the return type is not changed. We're still left with the possibility of the count overflowing now that "size" is a size_t though I think.
Phillip
Show 24 quoted lines
> I'm concerned that the preparation of these patches and the others > you've sent has relied too heavily on a flawed mechanical process, and > have not enough on manual review reading the code and reasoning about it.
> > Thanks
> > Phillip
> > >> Triggering this requires processing a file of 2GiB or more, so no test
>> is added.
>>
>> Signed-off-by: Elia Pinto <gitter.spiros@gmail.com>
>> ---
>>   diff.c | 2 +-
>>   1 file changed, 1 insertion(+), 1 deletion(-)
>>
>> diff --git a/diff.c b/diff.c
>> index b4ac17f8ef..ed7a931c41 100644
>> --- a/diff.c
>> +++ b/diff.c
>> @@ -655,7 +655,7 @@ struct line_range_callback {
>>       int ret;            /* latched error from orig_line_fn */
>>   };
>> -static int count_lines(const char *data, int size)
>> +static int count_lines(const char *data, size_t size)
>>   {
>>       int count, ch, completely_empty = 1, nl_just_seen = 0;
>>       count = 0;
> 
Previous: Phillip WoodNext: Elia Pinto
Message 5 of 6 in “use size_t for a few sizes that are 32 bits everywhere”
  1. 0/3 use size_t for a few sizes that are 32 bits everywhereElia Pinto, Nov 1, 2026
  2. 1/3 csum-file: use size_t for the count passed to hashwrite()Elia Pinto, Nov 1, 2026
  3. 2/3 diff: use size_t for the size passed to count_lines()Elia Pinto, Nov 1, 2026
  4. Phillip WoodNov 4, 2026
  5. Phillip WoodNov 4, 2026
  6. 3/3 diffcore-delta: use size_t for the size of the buffer to hashElia Pinto, Nov 1, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.