From: "René Scharfe" <l.s.r@web.de>
To: Toon Claes <toon@iotcl.com>, git@vger.kernel.org
Cc: Justin Tobler <jltobler@gmail.com>
Subject: Re: [PATCH 3/4] archive-zip: in write_zip_entry() call git_deflate() in a loop
Date: Thu, 7 Aug 2025 21:51:21 +0200 [thread overview]
Message-ID: <da21879f-5a73-41e1-9fc9-1ab128d8717d@web.de> (raw)
In-Reply-To: <20250804-toon-archive-zip-fix-v1-3-ca89858e5eaa@iotcl.com>
On 8/4/25 6:56 PM, Toon Claes wrote:
> The function git_deflate() might not complete to deflate all the input
> data in one go. While the function is already being called in a loop,
> every loop fresh data is read from the stream. This is not correct,
> because input data might get lost.
>
> As we see in many other callsites, git_deflate() should be called in a
> loop on the existing input to make it process all the input data.
>
> Add in a nested loop around git_deflate() to process the input buffer
> completely, before continuing the parent loop that reads from more data
> from the input stream.
>
> Co-authored-by: Justin Tobler <jltobler@gmail.com>
> Signed-off-by: Toon Claes <toon@iotcl.com>
> ---
> archive-zip.c | 18 ++++++++++--------
> 1 file changed, 10 insertions(+), 8 deletions(-)
>
> diff --git a/archive-zip.c b/archive-zip.c
> index d41a12de5f..25a0224130 100644
> --- a/archive-zip.c
> +++ b/archive-zip.c
> @@ -471,15 +471,17 @@ static int write_zip_entry(struct archiver_args *args,
>
> zstream.next_in = buf;
> zstream.avail_in = readlen;
> - zstream.next_out = compressed;
> - zstream.avail_out = sizeof(compressed);
> - result = git_deflate(&zstream, 0);
> - if (result != Z_OK)
> - die(_("deflate error (%d)"), result);
> - out_len = zstream.next_out - compressed;
> + do {
> + zstream.next_out = compressed;
> + zstream.avail_out = sizeof(compressed);
> + result = git_deflate(&zstream, 0);
> + if (result != Z_OK)
> + die(_("deflate error (%d)"), result);
> + out_len = zstream.next_out - compressed;
>
> - write_or_die(1, compressed, out_len);
> - compressed_size += out_len;
> + write_or_die(1, compressed, out_len);
> + compressed_size += out_len;
> + } while (zstream.avail_out == 0);
> }
> close_istream(stream);
> if (readlen)
>
Makes sense. If deflate somehow fills the output buffer (with
internally pending data, I suppose -- the fresh input data alone is not
enough), this clears it and lets it go another round without feeding new
input.
The mistake was thinking that the existence of deflateBound(), which
gives a maximum deflated size for any given input, implies a similarly
tight limit on individual chunks of input, which makes no sense in
hindsight.
René
next prev parent reply other threads:[~2025-08-07 19:56 UTC|newest]
Thread overview: 9+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-08-04 16:56 [PATCH 0/4] Fix archiving some corner-case files into zip Toon Claes
2025-08-04 16:56 ` [PATCH 1/4] archive-zip: deduplicate code setting output buffer in write_zip_entry() Toon Claes
2025-08-07 19:51 ` René Scharfe
2025-08-04 16:56 ` [PATCH 2/4] archive-zip: remove unneccesarry condition " Toon Claes
2025-08-07 19:51 ` René Scharfe
2025-08-04 16:56 ` [PATCH 3/4] archive-zip: in write_zip_entry() call git_deflate() in a loop Toon Claes
2025-08-07 19:51 ` René Scharfe [this message]
2025-08-04 16:56 ` [PATCH 4/4] archive-zip: move git_deflate() with Z_FINISH into the loop Toon Claes
2025-08-07 19:51 ` René Scharfe
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=da21879f-5a73-41e1-9fc9-1ab128d8717d@web.de \
--to=l.s.r@web.de \
--cc=git@vger.kernel.org \
--cc=jltobler@gmail.com \
--cc=toon@iotcl.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).