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

Reply via email to