tar verifies that all files specified in the include-file where found. However it does this by using find_list_entry, which will map a pattern to a filename. In this situation we want to map a filename to a pattern. Previously only patterns without any glob characters would match.
Fix this by introducing find_list_entry_pattern which does the inverse mapping. Signed-off-by: Tobias Waldekranz <[email protected]> --- archival/libarchive/find_list_entry.c | 12 ++++++++++++ archival/tar.c | 4 ++-- include/bb_archive.h | 1 + 3 files changed, 15 insertions(+), 2 deletions(-) diff --git a/archival/libarchive/find_list_entry.c b/archival/libarchive/find_list_entry.c index 56032c6..7b1ce37 100644 --- a/archival/libarchive/find_list_entry.c +++ b/archival/libarchive/find_list_entry.c @@ -9,6 +9,18 @@ #include "libbb.h" #include "bb_archive.h" +/* Find a shell pattern in a string list */ +const llist_t* FAST_FUNC find_list_entry_pattern(const llist_t *list, const char *pattern) +{ + while (list) { + if (fnmatch(pattern, list->data, 0) == 0) { + return list; + } + list = list->link; + } + return NULL; +} + /* Find a string in a shell pattern list */ const llist_t* FAST_FUNC find_list_entry(const llist_t *list, const char *filename) { diff --git a/archival/tar.c b/archival/tar.c index 3cd033b..8018be6 100644 --- a/archival/tar.c +++ b/archival/tar.c @@ -1099,8 +1099,8 @@ int tar_main(int argc UNUSED_PARAM, char **argv) /* Check that every file that should have been extracted was */ while (tar_handle->accept) { - if (!find_list_entry(tar_handle->reject, tar_handle->accept->data) - && !find_list_entry(tar_handle->passed, tar_handle->accept->data) + if (!find_list_entry_pattern(tar_handle->reject, tar_handle->accept->data) + && !find_list_entry_pattern(tar_handle->passed, tar_handle->accept->data) ) { bb_error_msg_and_die("%s: not found in archive", tar_handle->accept->data); diff --git a/include/bb_archive.h b/include/bb_archive.h index b82cfd8..cf6fa5b 100644 --- a/include/bb_archive.h +++ b/include/bb_archive.h @@ -191,6 +191,7 @@ void seek_by_read(int fd, off_t amount) FAST_FUNC; const char *strip_unsafe_prefix(const char *str) FAST_FUNC; void data_align(archive_handle_t *archive_handle, unsigned boundary) FAST_FUNC; +const llist_t *find_list_entry_pattern(const llist_t *list, const char *pattern) FAST_FUNC; const llist_t *find_list_entry(const llist_t *list, const char *filename) FAST_FUNC; const llist_t *find_list_entry2(const llist_t *list, const char *filename) FAST_FUNC; -- 1.8.4.357.g8d83871.dirty _______________________________________________ busybox mailing list [email protected] http://lists.busybox.net/mailman/listinfo/busybox
