Skip to content

Commit 37b92a9

Browse files
committed
Merge branch 'jk/index-pack-streaming-fix'
The streaming index-pack introduced in 1.7.11 had a data corruption bug, and this should fix it. * jk/index-pack-streaming-fix: index-pack: loop while inflating objects in unpack_data
2 parents b9a0801 + f8b0903 commit 37b92a9

File tree

1 file changed

+13
-10
lines changed

1 file changed

+13
-10
lines changed

builtin/index-pack.c

Lines changed: 13 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -524,7 +524,6 @@ static void *unpack_data(struct object_entry *obj,
524524
stream.avail_out = consume ? 64*1024 : obj->size;
525525

526526
do {
527-
unsigned char *last_out = stream.next_out;
528527
ssize_t n = (len < 64*1024) ? len : 64*1024;
529528
n = pread(pack_fd, inbuf, n, from);
530529
if (n < 0)
@@ -538,15 +537,19 @@ static void *unpack_data(struct object_entry *obj,
538537
len -= n;
539538
stream.next_in = inbuf;
540539
stream.avail_in = n;
541-
status = git_inflate(&stream, 0);
542-
if (consume) {
543-
if (consume(last_out, stream.next_out - last_out, cb_data)) {
544-
free(inbuf);
545-
free(data);
546-
return NULL;
547-
}
548-
stream.next_out = data;
549-
stream.avail_out = 64*1024;
540+
if (!consume)
541+
status = git_inflate(&stream, 0);
542+
else {
543+
do {
544+
status = git_inflate(&stream, 0);
545+
if (consume(data, stream.next_out - data, cb_data)) {
546+
free(inbuf);
547+
free(data);
548+
return NULL;
549+
}
550+
stream.next_out = data;
551+
stream.avail_out = 64*1024;
552+
} while (status == Z_OK && stream.avail_in);
550553
}
551554
} while (len && status == Z_OK && !stream.avail_in);
552555

0 commit comments

Comments
 (0)