From f8a46d2f3ffb25394ad8217c88f9a22ae075e7cb Mon Sep 17 00:00:00 2001 From: Michael Tremer Date: Fri, 10 Mar 2023 15:59:53 +0000 Subject: [PATCH] archive: Fix reading filelists/extraction on newer formats Fixes: #12995 - pakfire extracts meta files in archives Signed-off-by: Michael Tremer --- src/libpakfire/archive.c | 28 ++++++++++++----------- src/libpakfire/compress.c | 12 ++++++++-- src/libpakfire/include/pakfire/compress.h | 6 ++++- src/libpakfire/snapshot.c | 2 +- tests/libpakfire/archive.c | 3 --- 5 files changed, 31 insertions(+), 20 deletions(-) diff --git a/src/libpakfire/archive.c b/src/libpakfire/archive.c index 413c6a31c..f1e43c5ca 100644 --- a/src/libpakfire/archive.c +++ b/src/libpakfire/archive.c @@ -534,22 +534,24 @@ struct pakfire_archive_read { static int __pakfire_archive_filter_payload(struct pakfire* pakfire, struct archive* a, struct archive_entry* entry, void* p) { - struct pakfire_archive_read* _read = (struct pakfire_archive_read*)p; - struct pakfire_archive* archive = _read->archive; + const char* path = archive_entry_pathname(entry); + if (!path) + return PAKFIRE_WALK_ERROR; - const char* path = NULL; + switch (*path) { + case 'p': + if (strcmp(path, "pakfire-format") == 0) + return PAKFIRE_WALK_SKIP; - // Format >= 6 - if (archive->format >= 6) { - path = archive_entry_pathname(entry); + // Fallthrough - // Skip any hidden files - if (path && *path == '.') - return ARCHIVE_RETRY; - } + case '.': + return PAKFIRE_WALK_SKIP; - // Otherwise permit reading any files - return ARCHIVE_OK; + // The first file that isn't metadata was found, so we can end here + default: + return PAKFIRE_WALK_END; + } } static int __pakfire_archive_read_payload(struct pakfire* pakfire, @@ -727,7 +729,7 @@ static int __pakfire_archive_extract(struct pakfire_archive* archive, int flags) // Extract r = pakfire_extract(archive->pakfire, a, archive->stat.st_size, - filelist, prefix, nevra, flags); + filelist, prefix, nevra, __pakfire_archive_filter_payload, flags); if (r) goto ERROR; diff --git a/src/libpakfire/compress.c b/src/libpakfire/compress.c index b39c7f9a1..5d66474a7 100644 --- a/src/libpakfire/compress.c +++ b/src/libpakfire/compress.c @@ -569,6 +569,13 @@ int pakfire_walk(struct pakfire* pakfire, struct archive* archive, DEBUG(pakfire, "Filter callback sent SKIP\n"); continue; + case PAKFIRE_WALK_END: + DEBUG(pakfire, "Filter callback sent END\n"); + + // Clear the callback function + filter_callback = NULL; + break; + // Raise any other errors default: DEBUG(pakfire, "Filter callback returned an error: %d\n", r); @@ -760,7 +767,8 @@ ERROR: int pakfire_extract(struct pakfire* pakfire, struct archive* archive, size_t size, struct pakfire_filelist* filelist, - const char* prefix, const char* message, int flags) { + const char* prefix, const char* message, + pakfire_walk_filter_callback filter_callback, int flags) { int r = 1; // Use an empty string if no prefix set @@ -811,7 +819,7 @@ int pakfire_extract(struct pakfire* pakfire, struct archive* archive, } // Walk through the entire archive - r = pakfire_walk(pakfire, archive, __pakfire_extract, NULL, &data); + r = pakfire_walk(pakfire, archive, __pakfire_extract, filter_callback, &data); if (r) goto ERROR; diff --git a/src/libpakfire/include/pakfire/compress.h b/src/libpakfire/include/pakfire/compress.h index 3ed1bc2a3..ce6e760fc 100644 --- a/src/libpakfire/include/pakfire/compress.h +++ b/src/libpakfire/include/pakfire/compress.h @@ -52,6 +52,9 @@ enum pakfire_walk_codes { // Request the next entry (only in filter callback) PAKFIRE_WALK_SKIP = -20, + + // Like PAKFIRE_WALK_OK, but the callback will not be called again + PAKFIRE_WALK_END = -30, }; int pakfire_walk(struct pakfire* pakfire, struct archive* archive, @@ -66,7 +69,8 @@ enum pakfire_extract_flags { int pakfire_extract(struct pakfire* pakfire, struct archive* archive, size_t size, struct pakfire_filelist* filelist, const char* prefix, - const char* message, int flags); + const char* message, pakfire_walk_filter_callback filter_callback, + int flags); // Compress enum pakfire_compress_flags { diff --git a/src/libpakfire/snapshot.c b/src/libpakfire/snapshot.c index 6a9916296..ac9fbfcaa 100644 --- a/src/libpakfire/snapshot.c +++ b/src/libpakfire/snapshot.c @@ -182,7 +182,7 @@ static int pakfire_snapshot_extract(struct pakfire* pakfire, const char* path) { // Extract snapshot r = pakfire_extract(pakfire, archive, st.st_size, NULL, NULL, - _("Extracting snapshot..."), PAKFIRE_EXTRACT_SHOW_THROUGHPUT); + _("Extracting snapshot..."), NULL, PAKFIRE_EXTRACT_SHOW_THROUGHPUT); if (r) goto ERROR; diff --git a/tests/libpakfire/archive.c b/tests/libpakfire/archive.c index d3ac1f0c8..29926c24d 100644 --- a/tests/libpakfire/archive.c +++ b/tests/libpakfire/archive.c @@ -254,10 +254,7 @@ int main(int argc, const char* argv[]) { testsuite_add_test(test_read); #endif testsuite_add_test(test_copy); -#warning The filelist is being delivered incorrectly -#if 0 testsuite_add_test(test_filelist); -#endif testsuite_add_test(test_extract); testsuite_add_test(test_import); -- 2.39.5