From: Tim Kientzle Date: Thu, 13 Nov 2014 04:21:36 +0000 (-0800) Subject: Test support for UTF8 pathname extension in Zip archives X-Git-Tag: v3.1.900a~108 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=79516c2ff87a612f26cfa7e8541e178c3c6f8a79;p=thirdparty%2Flibarchive.git Test support for UTF8 pathname extension in Zip archives --- diff --git a/Makefile.am b/Makefile.am index 2e2755778..8bc1e1bbe 100644 --- a/Makefile.am +++ b/Makefile.am @@ -478,6 +478,7 @@ libarchive_test_SOURCES= \ libarchive/test/test_read_format_zip_padded.c \ libarchive/test/test_read_format_zip_sfx.c \ libarchive/test/test_read_format_zip_traditional_encryption_data.c \ + libarchive/test/test_read_format_zip_utf8_paths.c \ libarchive/test/test_read_format_zip_winzip_aes.c \ libarchive/test/test_read_format_zip_winzip_aes_large.c \ libarchive/test/test_read_format_zip_zip64.c \ @@ -783,6 +784,7 @@ libarchive_test_EXTRA_DIST=\ libarchive/test/test_read_format_zip_sfx.uu \ libarchive/test/test_read_format_zip_symlink.zip.uu \ libarchive/test/test_read_format_zip_traditional_encryption_data.zip.uu \ + libarchive/test/test_read_format_zip_utf8_paths.zip.uu \ libarchive/test/test_read_format_zip_ux.zip.uu \ libarchive/test/test_read_format_zip_winzip_aes128.zip.uu \ libarchive/test/test_read_format_zip_winzip_aes256.zip.uu \ diff --git a/libarchive/test/CMakeLists.txt b/libarchive/test/CMakeLists.txt index aa639b423..7c8300566 100644 --- a/libarchive/test/CMakeLists.txt +++ b/libarchive/test/CMakeLists.txt @@ -168,6 +168,7 @@ IF(ENABLE_TEST) test_read_format_zip_padded.c test_read_format_zip_sfx.c test_read_format_zip_traditional_encryption_data.c + test_read_format_zip_utf8_paths.c test_read_format_zip_winzip_aes.c test_read_format_zip_winzip_aes_large.c test_read_format_zip_zip64.c diff --git a/libarchive/test/test_read_format_zip_utf8_paths.c b/libarchive/test/test_read_format_zip_utf8_paths.c new file mode 100644 index 000000000..65b711e99 --- /dev/null +++ b/libarchive/test/test_read_format_zip_utf8_paths.c @@ -0,0 +1,91 @@ +/*- + * Copyright (c) 2003-2007 Tim Kientzle + * Copyright (c) 2011 Michihiro NAKAJIMA + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR(S) ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +#include "test.h" +__FBSDID("$FreeBSD$"); + +static void +verify(struct archive *a) { + struct archive_entry *ae; + const wchar_t *wp; + int file, i; + + /* + * Test file has a pattern to all names: They all have a + * number followed by " - " and an accented character. This + * archive was created by Windows and has regular filenames in + * some MBCS and uses the Zip 0x7075 extension to hold UTF-8 + * pathnames. The code below checks that the correct + * (Unicode) characters are decoded by comparing the number to + * the expected accented character. + */ + + for (file = 0; file < 20; ++file) { + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + wp = archive_entry_pathname_w(ae); + for (i = 0; wp[i] != 0; ++i) { + if (wp[i] == '2') { + failure("Unicode 'o with umlaut' expected"); + assertEqualInt(wp[i + 4], 0xF6); + } else if (wp[i] == '3') { + failure("Unicode 'a with umlaut' expected"); + assertEqualInt(wp[i + 4], 0xE4); + } else if (wp[i] == '4') { + failure("Unicode 'a with ring' expected"); + assertEqualInt(wp[i + 4], 0xE5); + } + } + } + assertEqualIntA(a, ARCHIVE_EOF, archive_read_next_header(a, &ae)); +} + +DEFINE_TEST(test_read_format_zip_utf8_paths) +{ + const char *refname = "test_read_format_zip_utf8_paths.zip"; + struct archive *a; + char *p; + size_t s; + + extract_reference_file(refname); + + /* Verify with seeking reader. */ + 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_filename(a, refname, 10240)); + verify(a); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_free(a)); + + /* Verify with streaming reader. */ + 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(a); + assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_free(a)); +} diff --git a/libarchive/test/test_read_format_zip_utf8_paths.zip.uu b/libarchive/test/test_read_format_zip_utf8_paths.zip.uu new file mode 100644 index 000000000..7e6cd742e --- /dev/null +++ b/libarchive/test/test_read_format_zip_utf8_paths.zip.uu @@ -0,0 +1,62 @@ +begin 644 test_read_format_zip_utf8_paths.zip +M4$L#!!0``````,(^9D5BZ95P"0````D````.````1FEL92`S("T@A"YT>'14 +M97-T(&9I;&502P,$%```````PCYF16+IE7`)````"0````X```!&:6QE(#0@ +M+2"&+G1X=%1E'1497-T(&9I;&502P,$%```````PCYF16+I +ME7`)````"0```!<```!&;VQD97(@,2]&:6QE(#(@+2"4+G1X=%1E'1497-T(&9I;&502P,$%```````PCYF +M16+IE7`)````"0```!L```!&;VQD97(@-"`M((8O1FEL92`R("T@E"YT>'14 +M97-T(&9I;&502P,$%```````PCYF16+IE7`)````"0```!L```!&;VQD97(@ +M-"`M((8O1FEL92`S("T@A"YT>'1497-T(&9I;&502P,$%```````PCYF16+I +ME7`)````"0```!L```!&;VQD97(@-"`M((8O1FEL92`T("T@ABYT>'1497-T +M(&9I;&502P,$%```````PCYF16+IE7`)````"0````H```!&:6QE(#$N='AT +M5&5S="!F:6QE4$L#!!0``````,(^9D5BZ95P"0````D````.````1FEL92`R +M("T@E"YT>'1497-T(&9I;&502P$"%``4``````#"/F9%8NF5<`D````)```` +M#@`````````!`"``````````1FEL92`S("T@A"YT>'102P$"%``4``````#" +M/F9%8NF5<`D````)````#@`````````!`"`````U````1FEL92`T("T@ABYT +M>'102P$"%``4``````#"/F9%8NF5<`D````)````$P`````````!`"````!J +M````1F]L9&5R(#$O1FEL92`Q+G1X=%!+`0(4`!0``````,(^9D5BZ95P"0`` +M``D````7``````````$`(````*0```!&;VQD97(@,2]&:6QE(#(@+2"4+G1X +M=%!+`0(4`!0``````,(^9D5BZ95P"0````D````7``````````$`(````.(` +M``!&;VQD97(@,2]&:6QE(#,@+2"$+G1X=%!+`0(4`!0``````,(^9D5BZ95P +M"0````D````7``````````$`(````"`!``!&;VQD97(@,2]&:6QE(#0@+2"& +M+G1X=%!+`0(4`!0``````,(^9D5BZ95P"0````D````7``````````$`(``` +M`%X!``!&;VQD97(@,B`M()0O1FEL92`Q+G1X=%!+`0(4`!0``````,(^9D5B +MZ95P"0````D````;``````````$`(````)P!``!&;VQD97(@,B`M()0O1FEL +M92`R("T@E"YT>'102P$"%``4``````#"/F9%8NF5<`D````)````&P`````` +M```!`"````#>`0``1F]L9&5R(#(@+2"4+T9I;&4@,R`M((0N='AT4$L!`A0` +M%```````PCYF16+IE7`)````"0```!L``````````0`@````(`(``$9O;&1E +M'102P$"%``4``````#"/F9% +M8NF5<`D````)````&P`````````!`"````#B`@``1F]L9&5R(#,@+2"$+T9I +M;&4@,R`M((0N='AT4$L!`A0`%```````PCYF16+IE7`)````"0```!L````` +M`````0`@````)`,``$9O;&1E'102P$"%``4``````#"/F9%8NF5<`D````)````&P`````````!`"````#F +M`P``1F]L9&5R(#0@+2"&+T9I;&4@,R`M((0N='AT4$L!`A0`%```````PCYF +M16+IE7`)````"0```!L``````````0`@````*`0``$9O;&1E