Commit c0e16a467d4004dd137881f390746f502141a91a

Edward Thomson 2020-12-15T23:03:03

pack: continue zlib while we can make progress Continue the zlib stream as long as we can make progress; stop when we stop getting output _or_ when zlib stops taking input from us.

diff --git a/src/pack.c b/src/pack.c
index 1b5cf67..1a208a0 100644
--- a/src/pack.c
+++ b/src/pack.c
@@ -841,7 +841,7 @@ static int packfile_unpack_compressed(
 
 	do {
 		size_t bytes = buffer_len - total;
-		unsigned int window_len;
+		unsigned int window_len, consumed;
 		unsigned char *in;
 
 		if ((in = pack_window_open(p, mwindow, *position, &window_len)) == NULL) {
@@ -857,10 +857,15 @@ static int packfile_unpack_compressed(
 
 		git_mwindow_close(mwindow);
 
-		if (!bytes)
-			break;
+		consumed = window_len - (unsigned int)zstream.in_len;
+
+		if (!bytes && !consumed) {
+			git_error_set(GIT_ERROR_ZLIB, "error inflating zlib stream");
+			error = -1;
+			goto out;
+		}
 
-		*position += window_len - zstream.in_len;
+		*position += consumed;
 		total += bytes;
 	} while (!git_zstream_eos(&zstream));