Thread (3 messages) 3 messages, 2 authors, 2025-03-14

Iffy output given git diff --unified=2147483647

From: Jason Cho <hidden>
Date: 2025-03-12 15:51:10

quoted hunk
$ git --versiongit version 2.47.0.windows.2

$ git diff --unified=2147483647 1.txt 2.txt
diff --git a/1.txt b/2.txt
index e53eaa1..1130481 100644
--- a/1.txt
+++ b/2.txt
@@ -1,10 +1,10 @@
 1
-2
+a
 3
 4
 5
 6
 7
 8
 a
 0
@@ -1,10 +1,10 @@
 1
 a
 3
 4
 5
 6
 7
 8
-9
+a
 0

$ git diff --unified=3 1.txt 2.txt
diff --git a/1.txt b/2.txt
index e53eaa1..1130481 100644
--- a/1.txt
+++ b/2.txt
@@ -1,10 +1,10 @@
 1
-2
+a
 3
 4
 5
 6
 7
 8
-9
+a
 0

$ diff --version
diff (GNU diffutils) 3.10
Copyright (C) 2023 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <https://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.

Written by Paul Eggert, Mike Haertel, David Hayes,
Richard Stallman, and Len Tower.

$ diff  --unified=2147483647 1.txt 2.txt
--- 1.txt       2025-03-12 16:04:06.947099900 +0100
+++ 2.txt       2025-03-12 16:04:27.131732400 +0100
@@ -1,10 +1,10 @@
 1
-2
+a
 3
 4
 5
 6
 7
 8
-9
+a
 0

Please see the above command line output. I run this on Windows with git for windows, but the problem should apply for other platforms. The version of my git is 2.47.

I prepare two files, I run GNU diff  --unified=2147483647 1.txt 2.txt, the output is correct. Then I run git diff with --unified=2147483647, the context of the second hunk is repeated, which is unexpected.

I investigated it and found the repetition is due to an overflow issue in   xdiff/xemit.c.

xdchange_t *xdl_get_hunk(xdchange_t **xscr, xdemitconf_t const *xecfg){
xdchange_t *xch, *xchp, *lxch;
long max_common = 2 * xecfg->ctxlen + xecfg->interhunkctxlen;  <- ----
...
}

The documentation https://git-scm.com/docs/git-diff doesn't say the range of --unified. Even if its max value is INT_MAX, 2147483647 is in the range.

Can you guys clarify the correct range of --unified? If my value 2147483647 is in range, git diff should output a diff without the strange repetition. Please fix it.


Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help