From 033a3a3460797d23936a59fb6030d28d4c41737f Mon Sep 17 00:00:00 2001 From: Emil Velikov Date: Mon, 30 Mar 2020 23:13:15 +0100 Subject: [PATCH] reader: track read_filter "can_skip" with a flag Analogous to the earlier "can_seek" change. Drop the function pointer in favour of a flag. Over the years, with over a dozen filters, no filters actually implemented it. If at a point in the future that changes, one can reinstate it. Alternatively one could use a ARCHIVE_FILTER_NONE check. Signed-off-by: Emil Velikov --- libarchive/archive_read.c | 6 +++--- libarchive/archive_read_private.h | 3 +-- libarchive/archive_read_support_filter_bzip2.c | 1 - libarchive/archive_read_support_filter_compress.c | 1 - libarchive/archive_read_support_filter_gzip.c | 1 - libarchive/archive_read_support_filter_lz4.c | 1 - libarchive/archive_read_support_filter_lzop.c | 1 - libarchive/archive_read_support_filter_program.c | 1 - libarchive/archive_read_support_filter_rpm.c | 1 - libarchive/archive_read_support_filter_uu.c | 1 - libarchive/archive_read_support_filter_xz.c | 1 - libarchive/archive_read_support_filter_zstd.c | 1 - 12 files changed, 4 insertions(+), 15 deletions(-) diff --git a/libarchive/archive_read.c b/libarchive/archive_read.c index 0a749c81d..9e9363d57 100644 --- a/libarchive/archive_read.c +++ b/libarchive/archive_read.c @@ -488,11 +488,11 @@ archive_read_open1(struct archive *_a) filter->data = a->client.dataset[0].data; filter->open = client_open_proxy; filter->read = client_read_proxy; - filter->skip = client_skip_proxy; filter->close = client_close_proxy; filter->sswitch = client_switch_proxy; filter->name = "none"; filter->code = ARCHIVE_FILTER_NONE; + filter->can_skip = 1; filter->can_seek = 1; a->client.dataset[0].begin_position = 0; @@ -1563,8 +1563,8 @@ advance_file_pointer(struct archive_read_filter *filter, int64_t request) return (total_bytes_skipped); /* If there's an optimized skip function, use it. */ - if (filter->skip != NULL) { - bytes_skipped = (filter->skip)(filter, request); + if (filter->can_skip != 0) { + bytes_skipped = client_skip_proxy(filter, request); if (bytes_skipped < 0) { /* error */ filter->fatal = 1; return (bytes_skipped); diff --git a/libarchive/archive_read_private.h b/libarchive/archive_read_private.h index b55595669..38605b8f4 100644 --- a/libarchive/archive_read_private.h +++ b/libarchive/archive_read_private.h @@ -91,8 +91,6 @@ struct archive_read_filter { int (*open)(struct archive_read_filter *self); /* Return next block. */ ssize_t (*read)(struct archive_read_filter *, const void **); - /* Skip forward this many bytes. */ - int64_t (*skip)(struct archive_read_filter *self, int64_t request); /* Close (just this filter) and free(self). */ int (*close)(struct archive_read_filter *self); /* Function that handles switching from reading one block to the next/prev */ @@ -104,6 +102,7 @@ struct archive_read_filter { const char *name; int code; + int can_skip; int can_seek; /* Used by reblocking logic. */ diff --git a/libarchive/archive_read_support_filter_bzip2.c b/libarchive/archive_read_support_filter_bzip2.c index 52537d855..d969383ef 100644 --- a/libarchive/archive_read_support_filter_bzip2.c +++ b/libarchive/archive_read_support_filter_bzip2.c @@ -200,7 +200,6 @@ bzip2_reader_init(struct archive_read_filter *self) state->out_block_size = out_block_size; state->out_block = out_block; self->read = bzip2_filter_read; - self->skip = NULL; /* not supported */ self->close = bzip2_filter_close; return (ARCHIVE_OK); diff --git a/libarchive/archive_read_support_filter_compress.c b/libarchive/archive_read_support_filter_compress.c index 36a708a15..f278ac7d6 100644 --- a/libarchive/archive_read_support_filter_compress.c +++ b/libarchive/archive_read_support_filter_compress.c @@ -227,7 +227,6 @@ compress_bidder_init(struct archive_read_filter *self) state->out_block_size = out_block_size; state->out_block = out_block; self->read = compress_filter_read; - self->skip = NULL; /* not supported */ self->close = compress_filter_close; /* XXX MOVE THE FOLLOWING OUT OF INIT() XXX */ diff --git a/libarchive/archive_read_support_filter_gzip.c b/libarchive/archive_read_support_filter_gzip.c index 49bd46920..0a9c065a6 100644 --- a/libarchive/archive_read_support_filter_gzip.c +++ b/libarchive/archive_read_support_filter_gzip.c @@ -315,7 +315,6 @@ gzip_bidder_init(struct archive_read_filter *self) state->out_block_size = out_block_size; state->out_block = out_block; 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; diff --git a/libarchive/archive_read_support_filter_lz4.c b/libarchive/archive_read_support_filter_lz4.c index 8d44d30a7..082bb7fe7 100644 --- a/libarchive/archive_read_support_filter_lz4.c +++ b/libarchive/archive_read_support_filter_lz4.c @@ -229,7 +229,6 @@ lz4_reader_init(struct archive_read_filter *self) self->data = state; state->stage = SELECT_STREAM; self->read = lz4_filter_read; - self->skip = NULL; /* not supported */ self->close = lz4_filter_close; return (ARCHIVE_OK); diff --git a/libarchive/archive_read_support_filter_lzop.c b/libarchive/archive_read_support_filter_lzop.c index 971f04ebf..98902bfd8 100644 --- a/libarchive/archive_read_support_filter_lzop.c +++ b/libarchive/archive_read_support_filter_lzop.c @@ -189,7 +189,6 @@ lzop_bidder_init(struct archive_read_filter *self) self->data = state; self->read = lzop_filter_read; - self->skip = NULL; /* not supported */ self->close = lzop_filter_close; return (ARCHIVE_OK); diff --git a/libarchive/archive_read_support_filter_program.c b/libarchive/archive_read_support_filter_program.c index 5d9d07192..839354748 100644 --- a/libarchive/archive_read_support_filter_program.c +++ b/libarchive/archive_read_support_filter_program.c @@ -429,7 +429,6 @@ __archive_read_program(struct archive_read_filter *self, const char *cmd) self->data = state; self->read = program_filter_read; - self->skip = NULL; self->close = program_filter_close; /* XXX Check that we can read at least one byte? */ diff --git a/libarchive/archive_read_support_filter_rpm.c b/libarchive/archive_read_support_filter_rpm.c index 73107e868..2cce17455 100644 --- a/libarchive/archive_read_support_filter_rpm.c +++ b/libarchive/archive_read_support_filter_rpm.c @@ -135,7 +135,6 @@ rpm_bidder_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_RPM; self->name = "rpm"; self->read = rpm_filter_read; - self->skip = NULL; /* not supported */ self->close = rpm_filter_close; rpm = (struct rpm *)calloc(sizeof(*rpm), 1); diff --git a/libarchive/archive_read_support_filter_uu.c b/libarchive/archive_read_support_filter_uu.c index 7a6da6a10..7252a6d67 100644 --- a/libarchive/archive_read_support_filter_uu.c +++ b/libarchive/archive_read_support_filter_uu.c @@ -361,7 +361,6 @@ uudecode_bidder_init(struct archive_read_filter *self) self->code = ARCHIVE_FILTER_UU; self->name = "uu"; self->read = uudecode_filter_read; - self->skip = NULL; /* not supported */ self->close = uudecode_filter_close; uudecode = (struct uudecode *)calloc(sizeof(*uudecode), 1); diff --git a/libarchive/archive_read_support_filter_xz.c b/libarchive/archive_read_support_filter_xz.c index f557377f2..e8b5300c5 100644 --- a/libarchive/archive_read_support_filter_xz.c +++ b/libarchive/archive_read_support_filter_xz.c @@ -486,7 +486,6 @@ xz_lzma_bidder_init(struct archive_read_filter *self) state->out_block_size = out_block_size; state->out_block = out_block; self->read = xz_filter_read; - self->skip = NULL; /* not supported */ self->close = xz_filter_close; state->stream.avail_in = 0; diff --git a/libarchive/archive_read_support_filter_zstd.c b/libarchive/archive_read_support_filter_zstd.c index b4528b35f..f7e2923cf 100644 --- a/libarchive/archive_read_support_filter_zstd.c +++ b/libarchive/archive_read_support_filter_zstd.c @@ -190,7 +190,6 @@ zstd_bidder_init(struct archive_read_filter *self) state->out_block = out_block; state->dstream = dstream; self->read = zstd_filter_read; - self->skip = NULL; /* not supported */ self->close = zstd_filter_close; state->eof = 0; -- 2.47.3