From: Tobias Stoeckmann Date: Fri, 29 May 2026 16:00:49 +0000 (+0200) Subject: Merge pull request #3085 from stoeckmann/gzip_check X-Git-Tag: v3.8.8~80 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=11228c993633da03d458971efd442ef8f8b37c71;p=thirdparty%2Flibarchive.git Merge pull request #3085 from stoeckmann/gzip_check gzip: Support more large in-memory archives (cherry picked from commit 3b6b10e7e2838eed19e1a6bf138ad4b176d68b97) --- diff --git a/libarchive/archive_read_support_filter_gzip.c b/libarchive/archive_read_support_filter_gzip.c index 0e21f28d2..ea1b102ce 100644 --- a/libarchive/archive_read_support_filter_gzip.c +++ b/libarchive/archive_read_support_filter_gzip.c @@ -340,7 +340,7 @@ static int consume_header(struct archive_read_filter *self) { struct private_data *state; - ssize_t avail; + ssize_t avail, max_in; size_t len; int ret; @@ -358,6 +358,18 @@ consume_header(struct archive_read_filter *self) /* Initialize compression library. */ state->stream.next_in = (unsigned char *)(uintptr_t) __archive_read_filter_ahead(self->upstream, 1, &avail); + if (avail < 0) { + archive_set_error(&self->archive->archive, + ARCHIVE_ERRNO_MISC, + "Failed to read gzip input"); + return (ARCHIVE_FATAL); + } + if (UINT_MAX >= SSIZE_MAX) + max_in = SSIZE_MAX; + else + max_in = UINT_MAX; + if (avail > max_in) + avail = max_in; state->stream.avail_in = (uInt)avail; ret = inflateInit2(&(state->stream), -15 /* Don't check for zlib header */);