summaryrefslogtreecommitdiff
path: root/libarchive
diff options
context:
space:
mode:
authorEric van Gyzen <eric@vangyzen.net>2022-09-30 10:28:09 -0500
committerEric van Gyzen <eric@vangyzen.net>2022-09-30 10:31:21 -0500
commit108c02b33e3db45fcbe9d1e124383e1942cd6498 (patch)
treecae55f00bd967859e1f6170e5ce0ed9035729b66 /libarchive
parent01a280fbf0794f575eb39d718a558896add18d30 (diff)
downloadlibarchive-108c02b33e3db45fcbe9d1e124383e1942cd6498.tar.gz
Support reading mtree files with tabs
Commit 45c5008c4 requires all characters in an mtree file to be printable, as determined by `isprint()`. This broke support for reading mtree files with tab characters, which are valid and otherwise supported by libarchive. Allow them. Add a unit test. Fixes #1782
Diffstat (limited to 'libarchive')
-rw-r--r--libarchive/archive_read_support_format_mtree.c2
-rw-r--r--libarchive/test/test_read_format_mtree.c30
2 files changed, 31 insertions, 1 deletions
diff --git a/libarchive/archive_read_support_format_mtree.c b/libarchive/archive_read_support_format_mtree.c
index 55f391cf..22759ab5 100644
--- a/libarchive/archive_read_support_format_mtree.c
+++ b/libarchive/archive_read_support_format_mtree.c
@@ -1071,7 +1071,7 @@ read_mtree(struct archive_read *a, struct mtree *mtree)
continue;
/* Non-printable characters are not allowed */
for (s = p;s < p + len - 1; s++) {
- if (!isprint((unsigned char)*s)) {
+ if (!isprint((unsigned char)*s) && *s != '\t') {
r = ARCHIVE_FATAL;
break;
}
diff --git a/libarchive/test/test_read_format_mtree.c b/libarchive/test/test_read_format_mtree.c
index 41d32578..40c65868 100644
--- a/libarchive/test/test_read_format_mtree.c
+++ b/libarchive/test/test_read_format_mtree.c
@@ -789,6 +789,7 @@ DEFINE_TEST(test_read_format_mtree_nonexistent_contents_file)
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
+
/*
* Check mtree file with non-printable ascii characters
*/
@@ -814,3 +815,32 @@ DEFINE_TEST(test_read_format_mtree_noprint)
assertEqualInt(ARCHIVE_OK, archive_read_close(a));
assertEqualInt(ARCHIVE_OK, archive_read_free(a));
}
+
+/*
+ * Check mtree file with tab characters, which are supported but not printable
+ */
+DEFINE_TEST(test_read_format_mtree_tab)
+{
+ static char archive[] =
+ "#mtree\n"
+ "\ta\ttype=file\n";
+ struct archive_entry *ae;
+ struct archive *a;
+
+ assert((a = archive_read_new()) != NULL);
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_support_filter_all(a));
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_support_format_all(a));
+ assertEqualIntA(a, ARCHIVE_OK,
+ archive_read_open_memory(a, archive, sizeof(archive)));
+
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae));
+ assertEqualString(archive_entry_pathname(ae), "a");
+ assertEqualInt(archive_entry_filetype(ae), AE_IFREG);
+
+ assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae));
+ assertEqualInt(1, archive_file_count(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}