diff options
author | Emil Velikov <emil.l.velikov@gmail.com> | 2020-03-14 15:47:22 +0000 |
---|---|---|
committer | Emil Velikov <emil.l.velikov@gmail.com> | 2021-10-23 19:26:23 +0100 |
commit | 64b82ac5c8cb5d822962af988dd075331d997b79 (patch) | |
tree | cc8b826ca62145d14c2bd3345544ac73c8b77e23 /libarchive/archive_read.c | |
parent | 0e0d31a7d2e7f66aab5a1c43579afbe864851200 (diff) | |
download | libarchive-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.c | 31 |
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, |