git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH v2 1/7] xdl_change_compact(): fix compaction heuristic to adjust ixo

From
Michael Haggerty <mhagger@alum.mit.edu>
Date
Aug 22, 2016, 11:22 UTC
Message-ID
<119c03e74c022ccdd6ebd8661a98b43917f8e966.1471864378.git.mhagger@alum.mit.edu>
In-Reply-To
<cover.1471864378.git.mhagger@alum.mit.edu>

The code branch used for the compaction heuristic forgot to keep ixo in sync while the group was shifted. This is certainly wrong, as it causes the two counters to get out of sync.

I *think* that this bug could also have caused the function to read past the end of the rchgo array, though I haven't done the work to prove it for sure. Here is my reasoning:

If ixo is not decremented correctly during one iteration of the outer while loop, then it will loose sync with the ix counter. In particular, ixo 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 ixo 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 ixo 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.

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
---
 xdiff/xdiffi.c | 1 +
 1 file changed, 1 insertion(+)
diff --git a/xdiff/xdiffi.c b/xdiff/xdiffi.c
index b3c6848..95b037e 100644
--- a/xdiff/xdiffi.c
+++ b/xdiff/xdiffi.c
@@ -528,6 +528,7 @@ int xdl_change_compact(xdfile_t *xdf, xdfile_t *xdfo, long flags) {
 			       recs_match(recs, ixs - 1, ix - 1, flags)) {
 				rchg[--ixs] = 1;
 				rchg[--ix] = 0;
+				while (rchgo[--ixo]);
 			}
 		}
 	}
-- 
2.9.3
Previous: Michael HaggertyNext: Michael Haggerty
Message 3 of 13 in “Better heuristics make prettier diffs”
  1. 0/7 Better heuristics make prettier diffsMichael Haggerty, Aug 22, 2016
  2. 2/7 xdl_change_compact(): only use heuristic if group can't be matchedMichael Haggerty, Aug 22, 2016
  3. 1/7 xdl_change_compact(): fix compaction heuristic to adjust ixoMichael Haggerty, Aug 22, 2016
  4. 6/7 diff: improve positioning of add/delete blocks in diffsMichael Haggerty, Aug 22, 2016
  5. 3/7 is_blank_line(): take a single xrecord_t as argumentMichael Haggerty, Aug 22, 2016
  6. 5/7 xdl_change_compact(): introduce the concept of a change groupMichael Haggerty, Aug 22, 2016
  7. Junio C HamanoAug 23, 2016
  8. 4/7 recs_match(): take two xrecord_t pointers as argumentsMichael Haggerty, Aug 22, 2016
  9. 7/7 blame: actually use the diff opts parsed from the command lineMichael Haggerty, Aug 22, 2016
  10. René ScharfeAug 23, 2016
  11. Michael HaggertySep 5, 2016
  12. Junio C HamanoSep 7, 2016
  13. Junio C HamanoAug 23, 2016

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.