]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Support reading mtree files with tabs 1783/head
authorEric van Gyzen <eric@vangyzen.net>
Fri, 30 Sep 2022 15:28:09 +0000 (10:28 -0500)
committerEric van Gyzen <eric@vangyzen.net>
Fri, 30 Sep 2022 15:31:21 +0000 (10:31 -0500)
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

libarchive/archive_read_support_format_mtree.c
libarchive/test/test_read_format_mtree.c

index 55f391cff090707b4ff39c2be69adfc06ef8c4c7..22759ab52e9f6a8ff1a29c0bcdf8e06093a6e705 100644 (file)
@@ -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;
                        }
index 41d3257889234ecc185b76f02890df3bee7c9fa7..40c65868d88a2e0dc223aec71b8c99850405b0c5 100644 (file)
@@ -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));
+}