diff --git a/libarchive/archive_read_support_filter_lz4.c b/libarchive/archive_read_support_filter_lz4.c index 28189a07..83e00ccb 100644 --- a/libarchive/archive_read_support_filter_lz4.c +++ b/libarchive/archive_read_support_filter_lz4.c @@ -180,6 +180,7 @@ lz4_reader_bid(struct archive_read_filter_bidder *b, uint32_t frame_data_size; /* Skip over the magic number */ + bits_checked += 28; offset_in_buffer += 4; /* Ensure that we can read another 4 bytes. */ @@ -205,13 +206,11 @@ lz4_reader_bid(struct archive_read_filter_bidder *b, * if this is LZ4 data. */ if (archive_ckd_add_size(&min, - offset_in_buffer, min_lz4_frame_size)) + offset_in_buffer, min_lz4_frame_size) || + min > max_lookahead) return (0); /* TODO: should this be >= ? */ if (min > (size_t)avail) { - if (min > max_lookahead) - return (0); - buffer = __archive_read_filter_ahead(f, min, &avail); if (buffer == NULL) @@ -226,7 +225,6 @@ lz4_reader_bid(struct archive_read_filter_bidder *b, * follows, or this isn't LZ4 data. */ - bits_checked = offset_in_buffer; buffer = buffer + offset_in_buffer; if (magic_number == LZ4_MAGICNUMBER) { diff --git a/libarchive/archive_read_support_filter_zstd.c b/libarchive/archive_read_support_filter_zstd.c index 163f54b5..c676d62b 100644 --- a/libarchive/archive_read_support_filter_zstd.c +++ b/libarchive/archive_read_support_filter_zstd.c @@ -25,10 +25,6 @@ #include "archive_platform.h" -#ifdef HAVE_ERRNO_H -#include -#endif - #ifdef HAVE_ERRNO_H #include #endif @@ -109,6 +105,7 @@ zstd_bidder_bid(struct archive_read_filter_bidder *b, { const unsigned char *buffer; ssize_t avail; + int bits_checked = 0; /* * Zstandard skippable frames contain a 4 byte magic number followed * by a 4 byte frame data size, then that number of bytes of data. @@ -147,6 +144,7 @@ zstd_bidder_bid(struct archive_read_filter_bidder *b, uint32_t frame_data_size; /* Skip over the magic number */ + bits_checked += 28; offset_in_buffer += 4; /* Ensure that we can read another 4 bytes. */ @@ -172,12 +170,10 @@ zstd_bidder_bid(struct archive_read_filter_bidder *b, * if this is zstd data. */ if (archive_ckd_add_size(&min, - offset_in_buffer, min_zstd_frame_size)) + offset_in_buffer, min_zstd_frame_size) || + min > max_lookahead) return (0); if (min > (size_t)avail) { - if (min > max_lookahead) - return (0); - buffer = __archive_read_filter_ahead(f, min, &avail); if (buffer == NULL) @@ -193,7 +189,7 @@ zstd_bidder_bid(struct archive_read_filter_bidder *b, */ if (magic_number == zstd_magic) - return (offset_in_buffer + 4); + return (bits_checked + 32); return (0); }