pack-objects: do not truncate result in-pack object size on 32-bit systems
authorNguyễn Thái Ngọc Duy <pclouds@gmail.com>
Wed, 13 Jul 2016 15:44:03 +0000 (17:44 +0200)
committerJunio C Hamano <gitster@pobox.com>
Wed, 13 Jul 2016 16:15:17 +0000 (09:15 -0700)
commitaf92a645d30b9ac775cdfe5dd56ea1d66fb6e492
tree9d05f4e5817eaf429e596bb1966014012ff9732a
parentda49a7da3ad5e31fa858a6d48d8a6af9c4690724
pack-objects: do not truncate result in-pack object size on 32-bit systems

A typical diff will not show what's going on and you need to see full
functions. The core code is like this, at the end of of write_one()

e->idx.offset = *offset;
size = write_object(f, e, *offset);
if (!size) {
e->idx.offset = recursing;
return WRITE_ONE_BREAK;
}
written_list[nr_written++] = &e->idx;

/* make sure off_t is sufficiently large not to wrap */
if (signed_add_overflows(*offset, size))
die("pack too large for current definition of off_t");
*offset += size;

Here we can see that the in-pack object size is returned by
write_object (or indirectly by write_reuse_object). And it's used to
calculate object offsets, which end up in the pack index file,
generated at the end.

If "size" overflows (on 32-bit sytems, unsigned long is 32-bit while
off_t can be 64-bit), we got wrong offsets and produce incorrect .idx
file, which may make it look like the .pack file is corrupted.

Signed-off-by: Nguyễn Thái Ngọc Duy <pclouds@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/pack-objects.c