From df2b46bf40d073bc9547c4c96f486a1fa05bd4cc Mon Sep 17 00:00:00 2001 From: Tim Kientzle Date: Sun, 13 Mar 2016 20:10:24 -0700 Subject: [PATCH] Update MSDOS file attribute test --- libarchive/test/test_read_format_zip_msdos.c | 28 ++++++++++++++++--- .../test/test_read_format_zip_msdos.zip.uu | 4 +-- 2 files changed, 26 insertions(+), 6 deletions(-) diff --git a/libarchive/test/test_read_format_zip_msdos.c b/libarchive/test/test_read_format_zip_msdos.c index 66da77c22..fe287e1ac 100644 --- a/libarchive/test/test_read_format_zip_msdos.c +++ b/libarchive/test/test_read_format_zip_msdos.c @@ -30,6 +30,8 @@ DEFINE_TEST(test_read_format_zip_msdos) const char *refname = "test_read_format_zip_msdos.zip"; struct archive *a; struct archive_entry *ae; + char *p; + size_t s; extract_reference_file(refname); @@ -39,8 +41,10 @@ DEFINE_TEST(test_read_format_zip_msdos) assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); assertEqualIntA(a, ARCHIVE_OK, archive_read_open_filename(a, refname, 17)); + /* 'ab' is marked as a directory in the central dir + * with MSDOS attribute info */ assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); - assertEqualString("a/", archive_entry_pathname(ae)); + assertEqualString("ab/", archive_entry_pathname(ae)); assertEqualInt(AE_IFDIR | 0775, archive_entry_mode(ae)); assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); @@ -52,12 +56,28 @@ DEFINE_TEST(test_read_format_zip_msdos) assertEqualInt(ARCHIVE_OK, archive_read_free(a)); /* Verify with streaming reader. */ -#if 0 p = slurpfile(&s, refname); 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, read_open_memory(a, p, s, 31)); - verify_basic(a, 0); -#endif + + /* + * 'ab' is not marked as a directory in the local file header + * (local file headers lack external attribute info), so the + * streaming reader can only determine if something is a directory + * by whether the name ends in '/'. + */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("ab", archive_entry_pathname(ae)); + assertEqualInt(AE_IFREG | 0664, archive_entry_mode(ae)); + + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualString("a/gru\xCC\x88n.png", archive_entry_pathname(ae)); + assertEqualInt(AE_IFREG | 0664, archive_entry_mode(ae)); + + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualInt(ARCHIVE_OK, archive_read_free(a)); + free(p); } diff --git a/libarchive/test/test_read_format_zip_msdos.zip.uu b/libarchive/test/test_read_format_zip_msdos.zip.uu index 6e9fd9a61..1691ca97b 100644 --- a/libarchive/test/test_read_format_zip_msdos.zip.uu +++ b/libarchive/test/test_read_format_zip_msdos.zip.uu @@ -1,7 +1,7 @@ begin 644 test_read_format_zip_msdos.zip -M4$L#!!0``````&9A3D,````````````````"````82]02P,$"@``````M)QO +M4$L#!!0``````&9A3D,````````````````"````86)02P,$"@``````M)QO M/-&'5C4&````!@````P```!A+V=R=