Thread (4 messages) flat view 4 messages, 3 authors, 2025-08-04

Re: [PATCH] archive: flush deflate stream until Z_STREAM_END

From: Justin Tobler <hidden>
Date: 2025-08-03 15:34:15

On 25/08/03 11:52AM, René Scharfe wrote:
On 8/3/25 12:08 AM, Justin Tobler wrote:
quoted
I've tested the patch against this specific file, and it fixes the
issue, but I'm uncertain how to reproduce and test this issue more
generically. I'm open to suggestions if anyone has some ideas :)
Not sure how to fill up zlib's pending buffer most efficiently.
Reducing the size of the output buffer would make the bug easier to
trigger, though.
Ya, I was able to trigger this issue more frequently by making the
output buffer smaller than the input buffer. I was really hoping though
to find a way to reproduce this without code changes so we could add a
test. Not sure if that is really feasible though in this case.
quoted
diff --git a/archive-zip.c b/archive-zip.c
index df8866d5bae..29e7c9f5e3f 100644
--- a/archive-zip.c
+++ b/archive-zip.c
@@ -492,14 +492,22 @@ static int write_zip_entry(struct archiver_args *args,
 
 		zstream.next_in = buf;
 		zstream.avail_in = 0;
-		result = git_deflate(&zstream, Z_FINISH);
-		if (result != Z_STREAM_END)
-			die("deflate error (%d)", result);
+
+		do {
+			result = git_deflate(&zstream, Z_FINISH);
+			if (result != Z_OK && result != Z_STREAM_END)
+				die("deflate error (%d)", result);
+
+			out_len = zstream.next_out - compressed;
+			if (out_len > 0) {
+				write_or_die(1, compressed, out_len);
+				compressed_size += out_len;
+				zstream.next_out = compressed;
+				zstream.avail_out = sizeof(compressed);
+			}
+		} while (result != Z_STREAM_END);
 
 		git_deflate_end(&zstream);
-		out_len = zstream.next_out - compressed;
-		write_or_die(1, compressed, out_len);
-		compressed_size += out_len;
Looks good.  Could probably rolled into the first loop, but that just
would make this fix more complicated.
I was also considering rolling this into the first loop, but ultimately
went with the minimal patch to fix the issue. I don't mind rerolling if
we prefer it the other way though. :)

Thanks for the review!

-Justin
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help