Skip to content
Browse files

Simply set -1 to a file offset not to appear before any directories;

some version of xorriso set its parent directory offset to the offset
of empty files.
Add a test for reading the iso images made by that xorriso.

SVN-Revision: 2959
  • Loading branch information...
1 parent e784783 commit d679998852916dd8421f830a5fe46fa59553c69a @ggcueroad ggcueroad committed Feb 9, 2011
View
2 Makefile.am
@@ -297,6 +297,7 @@ libarchive_test_SOURCES= \
libarchive/test/test_read_format_gtar_sparse.c \
libarchive/test/test_read_format_iso_gz.c \
libarchive/test/test_read_format_iso_multi_extent.c \
+ libarchive/test/test_read_format_iso_xorriso.c \
libarchive/test/test_read_format_isojoliet_bz2.c \
libarchive/test/test_read_format_isojoliet_long.c \
libarchive/test/test_read_format_isojoliet_rr.c \
@@ -423,6 +424,7 @@ libarchive_test_EXTRA_DIST=\
libarchive/test/test_read_format_iso_rockridge_ce.iso.Z.uu \
libarchive/test/test_read_format_iso_rockridge_new.iso.Z.uu \
libarchive/test/test_read_format_iso_rockridge_rr_moved.iso.Z.uu\
+ libarchive/test/test_read_format_iso_xorriso.iso.Z.uu \
libarchive/test/test_read_format_iso_zisofs.iso.Z.uu \
libarchive/test/test_read_format_lha_header0.lzh.uu \
libarchive/test/test_read_format_lha_header1.lzh.uu \
View
3 libarchive/archive_read_support_format_iso9660.c
@@ -1840,8 +1840,7 @@ parse_file_info(struct archive_read *a, struct file_info *parent,
*/
file->number = -1;
/* Do not appear before any directory entries. */
- if (file->offset == 0)
- file->offset = -1;
+ file->offset = -1;
} else
file->number = (int64_t)(uint32_t)location;
View
1 libarchive/test/CMakeLists.txt
@@ -66,6 +66,7 @@ IF(ENABLE_TEST)
test_read_format_gtar_sparse.c
test_read_format_iso_gz.c
test_read_format_iso_multi_extent.c
+ test_read_format_iso_xorriso.c
test_read_format_isojoliet_bz2.c
test_read_format_isojoliet_long.c
test_read_format_isojoliet_rr.c
View
217 libarchive/test/test_read_format_iso_xorriso.c
@@ -0,0 +1,217 @@
+/*-
+ * 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$");
+
+
+/*
+Execute the following command to rebuild the data for this program:
+ tail -n +32 test_read_format_iso_xorriso.c | /bin/sh
+#
+rm -rf /tmp/iso
+mkdir /tmp/iso
+mkdir /tmp/iso/dir
+mkdir /tmp/iso/dir2
+echo "hello" >/tmp/iso/file
+ln /tmp/iso/file /tmp/iso/hardlink
+(cd /tmp/iso; ln -s file symlink)
+TZ=utc touch -afm -t 197001020000.01 /tmp/iso/empty
+echo "hello2" >/tmp/iso/dir/file2
+echo "hello3" >/tmp/iso/dir/file3
+echo "hello4" >/tmp/iso/dir2/file4
+
+TZ=utc touch -afhm -t 197001020000.01 /tmp/iso/dir/file2 /tmp/iso/dir/file3
+TZ=utc touch -afhm -t 197001020000.01 /tmp/iso/dir2/file4
+TZ=utc touch -afhm -t 197001020000.01 /tmp/iso /tmp/iso/file /tmp/iso/dir
+TZ=utc touch -afhm -t 197001020000.01 /tmp/iso/dir2
+TZ=utc touch -afhm -t 197001030000.02 /tmp/iso/symlink
+F=test_read_format_iso_xorriso.iso
+xorriso -outdev - -map /tmp/iso / > $F
+compress $F
+uuencode $F.Z $F.Z > $F.Z.uu
+rm $F.Z
+exit 1
+ */
+
+/*
+ * A test for the iso images made by xorriso which versions are
+ * from 0.6.5 to 1.0.1.
+ * The xorriso set 0 to the location of empty files(include symlink
+ * files) that caused our iso reader could not read following directory
+ * entries at all.
+ *
+ */
+
+DEFINE_TEST(test_read_format_iso_xorriso)
+{
+ const char *refname = "test_read_format_iso_xorriso.iso.Z";
+ struct archive_entry *ae;
+ struct archive *a;
+ const void *p;
+ size_t size;
+#if ARCHIVE_VERSION_NUMBER < 3000000
+ off_t offset;
+#else
+ int64_t offset;
+#endif
+ int i;
+
+ extract_reference_file(refname);
+ assert((a = archive_read_new()) != NULL);
+ assertEqualInt(0, archive_read_support_compression_all(a));
+ assertEqualInt(0, archive_read_support_format_all(a));
+ assertEqualInt(ARCHIVE_OK,
+ archive_read_open_filename(a, refname, 10240));
+
+ /* Retrieve each of the 10 files on the ISO image and
+ * verify that each one is what we expect. */
+ for (i = 0; i < 10; ++i) {
+ assertEqualInt(0, archive_read_next_header(a, &ae));
+
+ if (strcmp(".", archive_entry_pathname(ae)) == 0) {
+ /* '.' root directory. */
+ assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
+ assertEqualInt(2048, archive_entry_size(ae));
+ /* Now, we read timestamp recorded by RRIP "TF". */
+ assertEqualInt(86401, archive_entry_mtime(ae));
+ assertEqualInt(0, archive_entry_mtime_nsec(ae));
+ /* Now, we read links recorded by RRIP "PX". */
+ assertEqualInt(4, archive_entry_nlink(ae));
+ assertEqualIntA(a, ARCHIVE_EOF,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt((int)size, 0);
+ } else if (strcmp("./dir", archive_entry_pathname(ae)) == 0) {
+ /* A directory. */
+ assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
+ assertEqualInt(2048, archive_entry_size(ae));
+ assertEqualInt(86401, archive_entry_mtime(ae));
+ assertEqualInt(86401, archive_entry_atime(ae));
+ assertEqualInt(2, archive_entry_nlink(ae));
+ } else if (strcmp("./dir2", archive_entry_pathname(ae)) == 0) {
+ /* A directory. */
+ assertEqualInt(AE_IFDIR, archive_entry_filetype(ae));
+ assertEqualInt(2048, archive_entry_size(ae));
+ assertEqualInt(86401, archive_entry_mtime(ae));
+ assertEqualInt(86401, archive_entry_atime(ae));
+ assertEqualInt(2, archive_entry_nlink(ae));
+ } else if (strcmp("./hardlink",
+ archive_entry_pathname(ae)) == 0) {
+ /* A regular file. */
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ assertEqualInt(6, archive_entry_size(ae));
+ assertEqualInt(0,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt(0, offset);
+ assertEqualMem(p, "hello\n", 6);
+ assertEqualInt(86401, archive_entry_mtime(ae));
+ assertEqualInt(86401, archive_entry_atime(ae));
+ assertEqualInt(2, archive_entry_nlink(ae));
+ } else if (strcmp("./file",
+ archive_entry_pathname(ae)) == 0) {
+ /* A hardlink to the regular file. */
+ /* Note: If "hardlink" gets returned before "file",
+ * then "hardlink" will get returned as a regular file
+ * and "file" will get returned as the hardlink.
+ * This test should tolerate that, since it's a
+ * perfectly permissible thing for libarchive to do. */
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ assertEqualString("./hardlink", archive_entry_hardlink(ae));
+ assertEqualInt(0, archive_entry_size_is_set(ae));
+ assertEqualInt(0, archive_entry_size(ae));
+ assertEqualInt(86401, archive_entry_mtime(ae));
+ assertEqualInt(86401, archive_entry_atime(ae));
+ assertEqualInt(2, archive_entry_stat(ae)->st_nlink);
+ } else if (strcmp("./symlink",
+ archive_entry_pathname(ae)) == 0) {
+ /* A symlink to the regular file. */
+ assertEqualInt(AE_IFLNK, archive_entry_filetype(ae));
+ assertEqualString("file", archive_entry_symlink(ae));
+ assertEqualInt(0, archive_entry_size(ae));
+ assertEqualInt(172802, archive_entry_mtime(ae));
+ assertEqualInt(172802, archive_entry_atime(ae));
+ assertEqualInt(1, archive_entry_stat(ae)->st_nlink);
+ } else if (strcmp("./empty",
+ archive_entry_pathname(ae)) == 0) {
+ /* A empty file. */
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ assertEqualInt(0, archive_entry_size(ae));
+ assertEqualInt(86401, archive_entry_mtime(ae));
+ assertEqualInt(86401, archive_entry_atime(ae));
+ assertEqualInt(1, archive_entry_nlink(ae));
+ } else if (strcmp("./dir/file2",
+ archive_entry_pathname(ae)) == 0) {
+ /* A regular file. */
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ assertEqualInt(7, archive_entry_size(ae));
+ assertEqualInt(0,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt(0, offset);
+ assertEqualMem(p, "hello2\n", 7);
+ assertEqualInt(86401, archive_entry_mtime(ae));
+ assertEqualInt(86401, archive_entry_atime(ae));
+ assertEqualInt(1, archive_entry_nlink(ae));
+ } else if (strcmp("./dir/file3",
+ archive_entry_pathname(ae)) == 0) {
+ /* A regular file. */
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ assertEqualInt(7, archive_entry_size(ae));
+ assertEqualInt(0,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt(0, offset);
+ assertEqualMem(p, "hello3\n", 7);
+ assertEqualInt(86401, archive_entry_mtime(ae));
+ assertEqualInt(86401, archive_entry_atime(ae));
+ assertEqualInt(1, archive_entry_nlink(ae));
+ } else if (strcmp("./dir2/file4",
+ archive_entry_pathname(ae)) == 0) {
+ /* A regular file. */
+ assertEqualInt(AE_IFREG, archive_entry_filetype(ae));
+ assertEqualInt(7, archive_entry_size(ae));
+ assertEqualInt(0,
+ archive_read_data_block(a, &p, &size, &offset));
+ assertEqualInt(0, offset);
+ assertEqualMem(p, "hello4\n", 7);
+ assertEqualInt(86401, archive_entry_mtime(ae));
+ assertEqualInt(86401, archive_entry_atime(ae));
+ assertEqualInt(1, archive_entry_nlink(ae));
+ } else {
+ failure("Saw a file that shouldn't have been there");
+ assertEqualString(archive_entry_pathname(ae), "");
+ }
+ }
+
+ /* End of archive. */
+ assertEqualInt(ARCHIVE_EOF, archive_read_next_header(a, &ae));
+
+ /* Verify archive format. */
+ assertEqualInt(archive_compression(a), ARCHIVE_COMPRESSION_COMPRESS);
+ assertEqualInt(archive_format(a), ARCHIVE_FORMAT_ISO9660_ROCKRIDGE);
+
+ /* Close the archive. */
+ assertEqualIntA(a, ARCHIVE_OK, archive_read_close(a));
+ assertEqualInt(ARCHIVE_OK, archive_read_free(a));
+}
+
+
View
61 libarchive/test/test_read_format_iso_xorriso.iso.Z.uu
@@ -0,0 +1,61 @@
+begin 644 test_read_format_iso_xorriso.iso.Z
+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
+3>(F8F(F:N(F<V(F>^(F@&(HZ`0``
+`
+end

0 comments on commit d679998

Please sign in to comment.
Something went wrong with that request. Please try again.