diff options
author | Eric van Gyzen <eric@vangyzen.net> | 2022-09-30 10:28:09 -0500 |
---|---|---|
committer | Eric van Gyzen <eric@vangyzen.net> | 2022-09-30 10:31:21 -0500 |
commit | 108c02b33e3db45fcbe9d1e124383e1942cd6498 (patch) | |
tree | cae55f00bd967859e1f6170e5ce0ed9035729b66 | |
parent | 01a280fbf0794f575eb39d718a558896add18d30 (diff) | |
download | libarchive-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
-rw-r--r-- | libarchive/archive_read_support_format_mtree.c | 2 | ||||
-rw-r--r-- | libarchive/test/test_read_format_mtree.c | 30 |
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)); +} |