[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