summaryrefslogtreecommitdiffstats
path: root/lib/libarchive
diff options
context:
space:
mode:
authorkientzle <kientzle@FreeBSD.org>2009-12-29 05:30:23 +0000
committerkientzle <kientzle@FreeBSD.org>2009-12-29 05:30:23 +0000
commit25112939defc86b149ace40c35e375ed691cfa2e (patch)
treea97b0444447fb61e0a2ad103dce7e03f4a8ceef0 /lib/libarchive
parent8471ffeefd2b59c0313617b33083485ad84f505a (diff)
downloadFreeBSD-src-25112939defc86b149ace40c35e375ed691cfa2e.zip
FreeBSD-src-25112939defc86b149ace40c35e375ed691cfa2e.tar.gz
Catch decompression failures earlier. In particular, this gives
immediate feedback if we fail to fork an external decompression program.
Diffstat (limited to 'lib/libarchive')
-rw-r--r--lib/libarchive/archive_read.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/lib/libarchive/archive_read.c b/lib/libarchive/archive_read.c
index bef2438..fd56dc6 100644
--- a/lib/libarchive/archive_read.c
+++ b/lib/libarchive/archive_read.c
@@ -354,6 +354,7 @@ build_stream(struct archive_read *a)
int number_bidders, i, bid, best_bid;
struct archive_read_filter_bidder *bidder, *best_bidder;
struct archive_read_filter *filter;
+ ssize_t avail;
int r;
for (;;) {
@@ -392,6 +393,13 @@ build_stream(struct archive_read *a)
free(filter);
return (r);
}
+ /* Verify the filter by asking it for some data. */
+ __archive_read_filter_ahead(filter, 1, &avail);
+ if (avail < 0) {
+ /* If the read failed, bail out now. */
+ free(filter);
+ return (avail);
+ }
a->filter = filter;
}
}
OpenPOWER on IntegriCloud