diff options
| author | Junio C Hamano <gitster@pobox.com> | 2025-03-29 16:39:10 +0900 |
|---|---|---|
| committer | Junio C Hamano <gitster@pobox.com> | 2025-03-29 16:39:10 +0900 |
| commit | 6767149eca352db846ae065fa67614a1b4bc45a6 (patch) | |
| tree | 06391cb7a25ad57afb17760c3610d93438ec7eb1 /xdiff | |
| parent | f76fe4ab067b9d6e530edf8205b5672ebad27bfc (diff) | |
| parent | d39e28e68c2b1bba25c5b1213fded95e525db15e (diff) | |
| download | git-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.c | 8 |
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 */ |
