unpack_object_header_buffer() attempts to protect against overflowing left shifts, but the limit of the shift amount should not be the size of the variable being shifted. It should be the size minus the size of its contents. Fix that accordingly. This was noticed at $DAYJOB by a fuzzer running internally. Signed-off-by: Jonathan Tan <jonathantanmy@xxxxxxxxxx> --- In next, d6a09e795d ("odb: guard against data loss checking out a huge file", 2021-11-03) (merged as fe5160a170 ("Merge branch 'mc/clean-smudge-with-llp64' into next", 2021-11-03)) ameliorates this situation by dying if the left shift overflows, but this patch is still worthwhile as it makes a bad header be reported as a bad header, not a fatal left shift overflow. --- packfile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packfile.c b/packfile.c index 89402cfc69..972c327e29 100644 --- a/packfile.c +++ b/packfile.c @@ -1068,7 +1068,7 @@ unsigned long unpack_object_header_buffer(const unsigned char *buf, size = c & 15; shift = 4; while (c & 0x80) { - if (len <= used || bitsizeof(long) <= shift) { + if (len <= used || (bitsizeof(long) - 7) <= shift) { error("bad object header"); size = used = 0; break; -- 2.34.0.rc0.344.g81b53c2807-goog