summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--lib/libarchive/archive_read_support_compression_all.c22
-rw-r--r--lib/libarchive/archive_read_support_compression_bzip2.c17
-rw-r--r--lib/libarchive/archive_read_support_compression_gzip.c16
3 files changed, 41 insertions, 14 deletions
diff --git a/lib/libarchive/archive_read_support_compression_all.c b/lib/libarchive/archive_read_support_compression_all.c
index 745f1ff..284eab5 100644
--- a/lib/libarchive/archive_read_support_compression_all.c
+++ b/lib/libarchive/archive_read_support_compression_all.c
@@ -31,18 +31,24 @@ __FBSDID("$FreeBSD$");
int
archive_read_support_compression_all(struct archive *a)
{
-#if HAVE_BZLIB_H
+ /* Bzip falls back to "bunzip2" command-line */
archive_read_support_compression_bzip2(a);
-#endif
/* The decompress code doesn't use an outside library. */
archive_read_support_compression_compress(a);
/* Gzip decompress falls back to "gunzip" command-line. */
archive_read_support_compression_gzip(a);
-#if HAVE_LZMADEC_H
- /* LZMA bidding is subject to false positives because
- * the LZMA file format has a very weak signature. It
- * may not be feasible to include LZMA detection here. */
- /* archive_read_support_compression_lzma(a); */
-#endif
+ /* The LZMA file format has a very weak signature, so it
+ * may not be feasible to keep this here, but we'll try.
+ * This will come back out if there are problems. */
+ /* Lzma falls back to "unlzma" command-line program. */
+ archive_read_support_compression_lzma(a);
+ /* Xz falls back to "unxz" command-line program. */
+ archive_read_support_compression_xz(a);
+
+ /* Note: We always return ARCHIVE_OK here, even if some of the
+ * above return ARCHIVE_WARN. The intent here is to enable
+ * "as much as possible." Clients who need specific
+ * compression should enable those individually so they can
+ * verify the level of support. */
return (ARCHIVE_OK);
}
diff --git a/lib/libarchive/archive_read_support_compression_bzip2.c b/lib/libarchive/archive_read_support_compression_bzip2.c
index 506dcfe..693bdd6 100644
--- a/lib/libarchive/archive_read_support_compression_bzip2.c
+++ b/lib/libarchive/archive_read_support_compression_bzip2.c
@@ -86,7 +86,13 @@ archive_read_support_compression_bzip2(struct archive *_a)
reader->init = bzip2_reader_init;
reader->options = NULL;
reader->free = bzip2_reader_free;
+#if HAVE_BZLIB_H
return (ARCHIVE_OK);
+#else
+ archive_set_error(_a, ARCHIVE_ERRNO_MISC,
+ "Using external bunzip2 program");
+ return (ARCHIVE_WARN);
+#endif
}
static int
@@ -150,10 +156,15 @@ bzip2_reader_bid(struct archive_read_filter_bidder *self, struct archive_read_fi
static int
bzip2_reader_init(struct archive_read_filter *self)
{
+ int r;
- archive_set_error(&self->archive->archive, -1,
- "This version of libarchive was compiled without bzip2 support");
- return (ARCHIVE_FATAL);
+ r = __archive_read_program(self, "bunzip2");
+ /* Note: We set the format here even if __archive_read_program()
+ * above fails. We do, after all, know what the format is
+ * even if we weren't able to read it. */
+ self->code = ARCHIVE_COMPRESSION_BZIP2;
+ self->name = "bzip2";
+ return (r);
}
diff --git a/lib/libarchive/archive_read_support_compression_gzip.c b/lib/libarchive/archive_read_support_compression_gzip.c
index bc3f143..14535405 100644
--- a/lib/libarchive/archive_read_support_compression_gzip.c
+++ b/lib/libarchive/archive_read_support_compression_gzip.c
@@ -92,7 +92,14 @@ archive_read_support_compression_gzip(struct archive *_a)
bidder->init = gzip_bidder_init;
bidder->options = NULL;
bidder->free = NULL; /* No data, so no cleanup necessary. */
+ /* Signal the extent of gzip support with the return value here. */
+#if HAVE_ZLIB_H
return (ARCHIVE_OK);
+#else
+ archive_set_error(_a, ARCHIVE_ERRNO_MISC,
+ "Using external gunzip program");
+ return (ARCHIVE_WARN);
+#endif
}
/*
@@ -207,9 +214,9 @@ gzip_bidder_bid(struct archive_read_filter_bidder *self,
#ifndef HAVE_ZLIB_H
/*
- * If we don't have the library on this system, we can't actually do the
- * decompression. We can, however, still detect compressed archives
- * and emit a useful message.
+ * If we don't have the library on this system, we can't do the
+ * decompression directly. We can, however, try to run gunzip
+ * in case that's available.
*/
static int
gzip_bidder_init(struct archive_read_filter *self)
@@ -217,6 +224,9 @@ gzip_bidder_init(struct archive_read_filter *self)
int r;
r = __archive_read_program(self, "gunzip");
+ /* Note: We set the format here even if __archive_read_program()
+ * above fails. We do, after all, know what the format is
+ * even if we weren't able to read it. */
self->code = ARCHIVE_COMPRESSION_GZIP;
self->name = "gzip";
return (r);
OpenPOWER on IntegriCloud