Skip to content

Commit 695f952

Browse files
committed
Merge branch 'maint'
* maint: sha1_file: Fix infinite loop when pack is corrupted
2 parents 18a5364 + b3118bd commit 695f952

File tree

2 files changed

+13
-0
lines changed

2 files changed

+13
-0
lines changed

sha1_file.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1357,6 +1357,8 @@ unsigned long get_size_from_delta(struct packed_git *p,
13571357
in = use_pack(p, w_curs, curpos, &stream.avail_in);
13581358
stream.next_in = in;
13591359
st = git_inflate(&stream, Z_FINISH);
1360+
if (st == Z_BUF_ERROR && (stream.avail_in || !stream.avail_out))
1361+
break;
13601362
curpos += stream.next_in - in;
13611363
} while ((st == Z_OK || st == Z_BUF_ERROR) &&
13621364
stream.total_out < sizeof(delta_head));
@@ -1594,6 +1596,8 @@ static void *unpack_compressed_entry(struct packed_git *p,
15941596
in = use_pack(p, w_curs, curpos, &stream.avail_in);
15951597
stream.next_in = in;
15961598
st = git_inflate(&stream, Z_FINISH);
1599+
if (st == Z_BUF_ERROR && (stream.avail_in || !stream.avail_out))
1600+
break;
15971601
curpos += stream.next_in - in;
15981602
} while (st == Z_OK || st == Z_BUF_ERROR);
15991603
git_inflate_end(&stream);

t/t5303-pack-corruption-resilience.sh

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -275,4 +275,13 @@ test_expect_success \
275275
git cat-file blob $blob_2 > /dev/null &&
276276
git cat-file blob $blob_3 > /dev/null'
277277

278+
test_expect_success \
279+
'corrupting header to have too small output buffer fails unpack' \
280+
'create_new_pack &&
281+
git prune-packed &&
282+
printf "\262\001" | do_corrupt_object $blob_1 0 &&
283+
test_must_fail git cat-file blob $blob_1 > /dev/null &&
284+
test_must_fail git cat-file blob $blob_2 > /dev/null &&
285+
test_must_fail git cat-file blob $blob_3 > /dev/null'
286+
278287
test_done

0 commit comments

Comments
 (0)