[PATCH] tar: correctly determine if all files where found when using -T

Tobias Waldekranz tobias at waldekranz.com
Mon Sep 23 12:13:35 UTC 2013


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 <tobias at waldekranz.com>
---
 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



More information about the busybox mailing list