Re: [PATCH v2] index-pack: always zero-initialize object_entry list
From: Thomas Rast <hidden>
Date: 2016-06-15 22:56:26
Jeff King [off-list ref] writes:
On Tue, Mar 19, 2013 at 11:52:44AM -0400, Jeff King wrote:quoted
quoted
quoted
quoted
Commit 38a4556 (index-pack: start learning to emulate "verify-pack -v", 2011-06-03) added a "delta_depth" counter to each "struct object_entry". Initially, all object entries have their depth set to 0; in resolve_delta, we then set the depth of each delta to "base + 1". Base entries never have their depth touched, and remain at 0.This patch causes index-pack to fail on the pack that triggered the whole discussion. More in a minute in another side thread, but meanwhile: NAK until we understand what is really going on here.Odd; that's what I was testing with, and it worked fine.Ah, interesting. I built the fix on top of d1a0ed1, the first commit that shows the problem. And it works fine there. But when it is forward-ported to the current master, it breaks as you saw. More bisection fun.So after bisecting, I realize that it is indeed broken on top of d1a0ed1. I have no idea why I didn't notice that before; I'm guessing it was because I was running it under valgrind and paying attention only to valgrind errors. Anyway, the problem is simple and stupid. The original object array is not nr_objects item long; it is (nr_objects + 1) long, though I'm not clear why (1-indexing?).
It apparently relates to the use of .idx.offset to compute the "next"
offset, cf. append_obj_to_pack():
struct object_entry *obj = &objects[nr_objects++];
...
obj[1].idx.offset = obj[0].idx.offset + n;
obj[1].idx.offset += write_compressed(f, buf, size);
So you trashed the offset of the first object after all the objects that
are actually *in* the patch.
And with that: ACK.
--
Thomas Rast
trast@{inf,student}.ethz.ch