| From 64333cef68d7bcc67bef6ecf177fbeaa549b9139 Mon Sep 17 00:00:00 2001 |
| From: Martin Matuska <martin@matuska.org> |
| Date: Sat, 29 Jun 2019 00:20:58 +0200 |
| Subject: [PATCH] Unbreak compilation without zlib |
| |
| Fixes #1214 |
| --- |
| libarchive/archive_read_support_filter_gzip.c | 54 ++++++++++++------- |
| libarchive/test/test_read_format_raw.c | 4 ++ |
| 2 files changed, 39 insertions(+), 19 deletions(-) |
| |
| diff --git a/libarchive/archive_read_support_filter_gzip.c b/libarchive/archive_read_support_filter_gzip.c |
| index 458b6f729..9fa9e2b0d 100644 |
| --- a/libarchive/archive_read_support_filter_gzip.c |
| +++ b/libarchive/archive_read_support_filter_gzip.c |
| @@ -131,12 +131,20 @@ archive_read_support_filter_gzip(struct archive *_a) |
| */ |
| static ssize_t |
| peek_at_header(struct archive_read_filter *filter, int *pbits, |
| - struct private_data *state) |
| +#ifdef HAVE_ZLIB_H |
| + struct private_data *state |
| +#else |
| + void *state |
| +#endif |
| + ) |
| { |
| const unsigned char *p; |
| ssize_t avail, len; |
| int bits = 0; |
| int header_flags; |
| +#ifndef HAVE_ZLIB_H |
| + (void)state; /* UNUSED */ |
| +#endif |
| |
| /* Start by looking at the first ten bytes of the header, which |
| * is all fixed layout. */ |
| @@ -153,8 +161,10 @@ peek_at_header(struct archive_read_filter *filter, int *pbits, |
| bits += 3; |
| header_flags = p[3]; |
| /* Bytes 4-7 are mod time in little endian. */ |
| +#ifdef HAVE_ZLIB_H |
| if (state) |
| state->mtime = archive_le32dec(p + 4); |
| +#endif |
| /* Byte 8 is deflate flags. */ |
| /* XXXX TODO: return deflate flags back to consume_header for use |
| in initializing the decompressor. */ |
| @@ -171,7 +181,9 @@ peek_at_header(struct archive_read_filter *filter, int *pbits, |
| |
| /* Null-terminated optional filename. */ |
| if (header_flags & 8) { |
| +#ifdef HAVE_ZLIB_H |
| ssize_t file_start = len; |
| +#endif |
| do { |
| ++len; |
| if (avail < len) |
| @@ -181,11 +193,13 @@ peek_at_header(struct archive_read_filter *filter, int *pbits, |
| return (0); |
| } while (p[len - 1] != 0); |
| |
| +#ifdef HAVE_ZLIB_H |
| if (state) { |
| /* Reset the name in case of repeat header reads. */ |
| free(state->name); |
| state->name = strdup((const char *)&p[file_start]); |
| } |
| +#endif |
| } |
| |
| /* Null-terminated optional comment. */ |
| @@ -236,24 +250,6 @@ gzip_bidder_bid(struct archive_read_filter_bidder *self, |
| return (0); |
| } |
| |
| -static int |
| -gzip_read_header(struct archive_read_filter *self, struct archive_entry *entry) |
| -{ |
| - struct private_data *state; |
| - |
| - state = (struct private_data *)self->data; |
| - |
| - /* A mtime of 0 is considered invalid/missing. */ |
| - if (state->mtime != 0) |
| - archive_entry_set_mtime(entry, state->mtime, 0); |
| - |
| - /* If the name is available, extract it. */ |
| - if (state->name) |
| - archive_entry_set_pathname(entry, state->name); |
| - |
| - return (ARCHIVE_OK); |
| -} |
| - |
| #ifndef HAVE_ZLIB_H |
| |
| /* |
| @@ -277,6 +273,24 @@ gzip_bidder_init(struct archive_read_filter *self) |
| |
| #else |
| |
| +static int |
| +gzip_read_header(struct archive_read_filter *self, struct archive_entry *entry) |
| +{ |
| + struct private_data *state; |
| + |
| + state = (struct private_data *)self->data; |
| + |
| + /* A mtime of 0 is considered invalid/missing. */ |
| + if (state->mtime != 0) |
| + archive_entry_set_mtime(entry, state->mtime, 0); |
| + |
| + /* If the name is available, extract it. */ |
| + if (state->name) |
| + archive_entry_set_pathname(entry, state->name); |
| + |
| + return (ARCHIVE_OK); |
| +} |
| + |
| /* |
| * Initialize the filter object. |
| */ |
| @@ -306,7 +320,9 @@ gzip_bidder_init(struct archive_read_filter *self) |
| self->read = gzip_filter_read; |
| self->skip = NULL; /* not supported */ |
| self->close = gzip_filter_close; |
| +#ifdef HAVE_ZLIB_H |
| self->read_header = gzip_read_header; |
| +#endif |
| |
| state->in_stream = 0; /* We're not actually within a stream yet. */ |
| |
| diff --git a/libarchive/test/test_read_format_raw.c b/libarchive/test/test_read_format_raw.c |
| index 0dac8bfba..3961723b4 100644 |
| --- a/libarchive/test/test_read_format_raw.c |
| +++ b/libarchive/test/test_read_format_raw.c |
| @@ -36,7 +36,9 @@ DEFINE_TEST(test_read_format_raw) |
| const char *reffile1 = "test_read_format_raw.data"; |
| const char *reffile2 = "test_read_format_raw.data.Z"; |
| const char *reffile3 = "test_read_format_raw.bufr"; |
| +#ifdef HAVE_ZLIB_H |
| const char *reffile4 = "test_read_format_raw.data.gz"; |
| +#endif |
| |
| /* First, try pulling data out of an uninterpretable file. */ |
| extract_reference_file(reffile1); |
| @@ -119,6 +121,7 @@ DEFINE_TEST(test_read_format_raw) |
| assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); |
| assertEqualInt(ARCHIVE_OK, archive_read_free(a)); |
| |
| +#ifdef HAVE_ZLIB_H |
| /* Fourth, try with gzip which has metadata. */ |
| extract_reference_file(reffile4); |
| assert((a = archive_read_new()) != NULL); |
| @@ -144,4 +147,5 @@ DEFINE_TEST(test_read_format_raw) |
| assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); |
| assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); |
| assertEqualInt(ARCHIVE_OK, archive_read_free(a)); |
| +#endif |
| } |