The code branch used for the compaction heuristic incorrectly forgot to keep io in sync while the group was shifted. I think that could have led to reading past the end of the rchgo array.
Signed-off-by: Michael Haggerty <mhag...@alum.mit.edu> --- I didn't actually try to verify the presence of a bug, because it seems like more work than worthwhile. But here is my reasoning: If io is not decremented correctly during one iteration of the outer `while` loop, then it will loose sync with the `end` counter. In particular it will be too large. Suppose that the next iterations of the outer `while` loop (i.e., processing the next block of add/delete lines) don't have any sliders. Then the `io` counter would be incremented by the number of non-changed lines in xdf, which is the same as the number of non-changed lines in xdfo that *should have* followed the group that experienced the malfunction. But since `io` was too large at the end of that iteration, it will be incremented past the end of the xdfo->rchg array, and will try to read that memory illegally. xdiff/xdiffi.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/xdiff/xdiffi.c b/xdiff/xdiffi.c index c67cfe3..66129db 100644 --- a/xdiff/xdiffi.c +++ b/xdiff/xdiffi.c @@ -562,6 +562,10 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) { recs_match(recs, start - 1, end - 1, flags)) { rchg[--start] = 1; rchg[--end] = 0; + + io--; + while (rchgo[io]) + io--; } } else if (end_matching_other != -1) { /* -- 2.8.1 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majord...@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html