aboutsummaryrefslogtreecommitdiffstats
path: root/xdiff
diff options
context:
space:
mode:
authorJunio C Hamano <gitster@pobox.com>2025-03-29 16:39:10 +0900
committerJunio C Hamano <gitster@pobox.com>2025-03-29 16:39:10 +0900
commit6767149eca352db846ae065fa67614a1b4bc45a6 (patch)
tree06391cb7a25ad57afb17760c3610d93438ec7eb1 /xdiff
parentf76fe4ab067b9d6e530edf8205b5672ebad27bfc (diff)
parentd39e28e68c2b1bba25c5b1213fded95e525db15e (diff)
downloadgit-6767149eca352db846ae065fa67614a1b4bc45a6.tar.gz
Merge branch 'rs/xdiff-context-length-fix'
The xdiff code on 32-bit platform misbehaved when an insanely large context size is given, which has been corrected. * rs/xdiff-context-length-fix: xdiff: avoid arithmetic overflow in xdl_get_hunk()
Diffstat (limited to 'xdiff')
-rw-r--r--xdiff/xemit.c8
1 files changed, 7 insertions, 1 deletions
diff --git a/xdiff/xemit.c b/xdiff/xemit.c
index f8e3f25b03..1d40c9cb40 100644
--- a/xdiff/xemit.c
+++ b/xdiff/xemit.c
@@ -43,6 +43,10 @@ static int xdl_emit_record(xdfile_t *xdf, long ri, char const *pre, xdemitcb_t *
return 0;
}
+static long saturating_add(long a, long b)
+{
+ return signed_add_overflows(a, b) ? LONG_MAX : a + b;
+}
/*
* Starting at the passed change atom, find the latest change atom to be included
@@ -52,7 +56,9 @@ static int xdl_emit_record(xdfile_t *xdf, long ri, char const *pre, xdemitcb_t *
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;
+ long max_common = saturating_add(saturating_add(xecfg->ctxlen,
+ xecfg->ctxlen),
+ xecfg->interhunkctxlen);
long max_ignorable = xecfg->ctxlen;
long ignored = 0; /* number of ignored blank lines */