summaryrefslogtreecommitdiff
path: root/libarchive/archive_read.c
diff options
context:
space:
mode:
authorEmil Velikov <emil.l.velikov@gmail.com>2020-03-14 15:47:22 +0000
committerEmil Velikov <emil.l.velikov@gmail.com>2021-10-23 19:26:23 +0100
commit64b82ac5c8cb5d822962af988dd075331d997b79 (patch)
treecc8b826ca62145d14c2bd3345544ac73c8b77e23 /libarchive/archive_read.c
parent0e0d31a7d2e7f66aab5a1c43579afbe864851200 (diff)
downloadlibarchive-64b82ac5c8cb5d822962af988dd075331d997b79.tar.gz
reader: introduce archive_read_filter_bidder::vtable
Provides a clear separation between RW data and RO executable code. Signed-off-by: Emil Velikov <emil.l.velikov@gmail.com>
Diffstat (limited to 'libarchive/archive_read.c')
-rw-r--r--libarchive/archive_read.c31
1 files changed, 16 insertions, 15 deletions
diff --git a/libarchive/archive_read.c b/libarchive/archive_read.c
index 01dcd5f1..cf97524b 100644
--- a/libarchive/archive_read.c
+++ b/libarchive/archive_read.c
@@ -561,12 +561,12 @@ choose_filters(struct archive_read *a)
bidder = a->bidders;
for (i = 0; i < number_bidders; i++, bidder++) {
- if (bidder->bid != NULL) {
- bid = (bidder->bid)(bidder, a->filter);
- if (bid > best_bid) {
- best_bid = bid;
- best_bidder = bidder;
- }
+ if (bidder->vtable == NULL)
+ continue;
+ bid = (bidder->vtable->bid)(bidder, a->filter);
+ if (bid > best_bid) {
+ best_bid = bid;
+ best_bidder = bidder;
}
}
@@ -591,7 +591,7 @@ choose_filters(struct archive_read *a)
filter->archive = a;
filter->upstream = a->filter;
a->filter = filter;
- r = (best_bidder->init)(a->filter);
+ r = (best_bidder->vtable->init)(a->filter);
if (r != ARCHIVE_OK) {
__archive_read_free_filters(a);
return (ARCHIVE_FATAL);
@@ -1103,9 +1103,10 @@ _archive_read_free(struct archive *_a)
/* Release the bidder objects. */
n = sizeof(a->bidders)/sizeof(a->bidders[0]);
for (i = 0; i < n; i++) {
- if (a->bidders[i].free != NULL) {
- (a->bidders[i].free)(&a->bidders[i]);
- }
+ if (a->bidders[i].vtable == NULL ||
+ a->bidders[i].vtable->free == NULL)
+ continue;
+ (a->bidders[i].vtable->free)(&a->bidders[i]);
}
/* Release passphrase list. */
@@ -1238,11 +1239,11 @@ __archive_read_get_bidder(struct archive_read *a,
number_slots = sizeof(a->bidders) / sizeof(a->bidders[0]);
for (i = 0; i < number_slots; i++) {
- if (a->bidders[i].bid == NULL) {
- memset(a->bidders + i, 0, sizeof(a->bidders[0]));
- *bidder = (a->bidders + i);
- return (ARCHIVE_OK);
- }
+ if (a->bidders[i].vtable != NULL)
+ continue;
+ memset(a->bidders + i, 0, sizeof(a->bidders[0]));
+ *bidder = (a->bidders + i);
+ return (ARCHIVE_OK);
}
archive_set_error(&a->archive, ENOMEM,