]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Merge pull request #3085 from stoeckmann/gzip_check
authorTobias Stoeckmann <stoeckmann@users.noreply.github.com>
Fri, 29 May 2026 16:00:49 +0000 (18:00 +0200)
committerMartin Matuska <martin@matuska.de>
Tue, 23 Jun 2026 08:56:12 +0000 (10:56 +0200)
gzip: Support more large in-memory archives
(cherry picked from commit 3b6b10e7e2838eed19e1a6bf138ad4b176d68b97)

libarchive/archive_read_support_filter_gzip.c

index 0e21f28d2a1a571a5489bd2c36b689354f36ecd4..ea1b102ce024c2773095191f7a2a170d8ccd205c 100644 (file)
@@ -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 */);