From: Elia Pinto Date: Sun, 01 Nov 2026 15:36:50 GMT Subject: [PATCH 2/3] diff: use size_t for the size passed to count_lines() Message-ID: <2011b90d80c5a823878055fd1016bc38b6a072b7.1793546752.git.gitter.spiros@gmail.com> In-Reply-To: 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". Triggering this requires processing a file of 2GiB or more, so no test is added. Signed-off-by: Elia Pinto --- 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; -- 2.53.0