]> git.ipfire.org Git - thirdparty/libarchive.git/commitdiff
Fix a minor date-parsing bug and fill in missing ISO9660 testing (#2260)
authorTim Kientzle <kientzle@acm.org>
Sat, 6 Jul 2024 07:45:38 +0000 (00:45 -0700)
committerGitHub <noreply@github.com>
Sat, 6 Jul 2024 07:45:38 +0000 (09:45 +0200)
This is somewhat academic, since we don't actually expose any of the
ISO9660 header information that is stored in 17-byte date format, but
inspection revealed an off-by-one error in the parsing here.

This also proved a nice motivation to fill in some verification in our
most basic ISO9660 test case.

libarchive/archive_read_support_format_iso9660.c
libarchive/test/test_read_format_iso_Z.c

index c38943a2fa34d5d77afd73f2a6e65bcb2a7f10e1..056beb5ffdd2151846459f1ba928e17d1c689c48 100644 (file)
@@ -3263,7 +3263,7 @@ isodate17(const unsigned char *v)
        tm.tm_year = (v[0] - '0') * 1000 + (v[1] - '0') * 100
            + (v[2] - '0') * 10 + (v[3] - '0')
            - 1900;
-       tm.tm_mon = (v[4] - '0') * 10 + (v[5] - '0');
+       tm.tm_mon = (v[4] - '0') * 10 + (v[5] - '0') - 1;
        tm.tm_mday = (v[6] - '0') * 10 + (v[7] - '0');
        tm.tm_hour = (v[8] - '0') * 10 + (v[9] - '0');
        tm.tm_min = (v[10] - '0') * 10 + (v[11] - '0');
index 785b00bf85df3a4b71eb158449d184afe352dccd..d07bc1bc883299d13560dfbda7c394fc2cf914b6 100644 (file)
@@ -40,8 +40,29 @@ test1(void)
            archive_read_support_format_all(a));
        assertEqualIntA(a, ARCHIVE_OK,
            archive_read_open_filename(a, name, 512));
+
+       /* Root directory */
        assertEqualIntA(a, ARCHIVE_OK,
            archive_read_next_header(a, &ae));
+       assertEqualIntA(a, 1131434684, archive_entry_atime(ae));
+       assertEqualIntA(a, 0, archive_entry_birthtime(ae));
+       assertEqualIntA(a, 1131434684, archive_entry_ctime(ae));
+       assertEqualIntA(a, 0, archive_entry_dev(ae));
+       assertEqualIntA(a, AE_IFDIR, archive_entry_filetype(ae));
+       assertEqualIntA(a, 0, archive_entry_gid(ae));
+       assertEqualStringA(a, NULL, archive_entry_gname(ae));
+       assertEqualIntA(a, 0, archive_entry_ino(ae));
+       assertEqualIntA(a, AE_IFDIR | 0700, archive_entry_mode(ae));
+       assertEqualIntA(a, 1131434684, archive_entry_mtime(ae));
+       assertEqualIntA(a, 2, archive_entry_nlink(ae));
+       assertEqualStringA(a, ".", archive_entry_pathname(ae));
+       assertEqualIntA(a, 0700, archive_entry_perm(ae));
+       assertEqualIntA(a, 2048, archive_entry_size(ae));
+       assertEqualIntA(a, 0, archive_entry_uid(ae));
+       assertEqualStringA(a, NULL, archive_entry_uname(ae));
+
+       assertEqualIntA(a, ARCHIVE_EOF,
+           archive_read_next_header(a, &ae));
        assertEqualInt(1, archive_file_count(a));
        assertEqualInt(archive_filter_code(a, 0),
            ARCHIVE_FILTER_COMPRESS);
@@ -67,21 +88,110 @@ test_small(const char *name)
            archive_read_support_format_all(a));
        assertEqualIntA(a, ARCHIVE_OK,
            archive_read_open_filename(a, name, 512));
+
+       /* Root directory */
        assertEqualIntA(a, ARCHIVE_OK,
            archive_read_next_header(a, &ae));
        assertEqualString(".", archive_entry_pathname(ae));
+       assertEqualIntA(a, 3443989665, archive_entry_atime(ae));
+       assertEqualIntA(a, 0, archive_entry_birthtime(ae));
+       assertEqualIntA(a, 3443989665, archive_entry_ctime(ae));
+       assertEqualIntA(a, 0, archive_entry_dev(ae));
+       assertEqualIntA(a, AE_IFDIR, archive_entry_filetype(ae));
+       assertEqualIntA(a, 0, archive_entry_gid(ae));
+       assertEqualStringA(a, NULL, archive_entry_gname(ae));
+       assertEqualIntA(a, 0, archive_entry_ino(ae));
+       assertEqualIntA(a, AE_IFDIR | 0700, archive_entry_mode(ae));
+       assertEqualIntA(a, 3443989665, archive_entry_mtime(ae));
+       assertEqualIntA(a, 4, archive_entry_nlink(ae));
+       assertEqualIntA(a, 0700, archive_entry_perm(ae));
+       assertEqualIntA(a, 2048, archive_entry_size(ae));
+       assertEqualIntA(a, 0, archive_entry_uid(ae));
+       assertEqualStringA(a, NULL, archive_entry_uname(ae));
+
+       /* Directory "A" */
        assertEqualIntA(a, ARCHIVE_OK,
            archive_read_next_header(a, &ae));
        assertEqualString("A", archive_entry_pathname(ae));
+       assertEqualIntA(a, 1313381406, archive_entry_atime(ae));
+       assertEqualIntA(a, 0, archive_entry_birthtime(ae));
+       assertEqualIntA(a, 1313381406, archive_entry_ctime(ae));
+       assertEqualIntA(a, 0, archive_entry_dev(ae));
+       assertEqualIntA(a, AE_IFDIR, archive_entry_filetype(ae));
+       assertEqualIntA(a, 0, archive_entry_gid(ae));
+       assertEqualStringA(a, NULL, archive_entry_gname(ae));
+       assertEqualIntA(a, 0, archive_entry_ino(ae));
+       assertEqualIntA(a, AE_IFDIR | 0700, archive_entry_mode(ae));
+       assertEqualIntA(a, 1313381406, archive_entry_mtime(ae));
+       assertEqualIntA(a, 2, archive_entry_nlink(ae));
+       assertEqualIntA(a, 0700, archive_entry_perm(ae));
+       assertEqualIntA(a, 2048, archive_entry_size(ae));
+       assertEqualIntA(a, 0, archive_entry_uid(ae));
+       assertEqualStringA(a, NULL, archive_entry_uname(ae));
+
+       /* File "A/B" */
        assertEqualIntA(a, ARCHIVE_OK,
            archive_read_next_header(a, &ae));
        assertEqualString("A/B", archive_entry_pathname(ae));
+       assertEqualIntA(a, 1313381406, archive_entry_atime(ae));
+       assertEqualIntA(a, 0, archive_entry_birthtime(ae));
+       assertEqualIntA(a, 1313381406, archive_entry_ctime(ae));
+       assertEqualIntA(a, 0, archive_entry_dev(ae));
+       assertEqualIntA(a, AE_IFREG, archive_entry_filetype(ae));
+       assertEqualIntA(a, 0, archive_entry_gid(ae));
+       assertEqualStringA(a, NULL, archive_entry_gname(ae));
+       assertEqualIntA(a, 0, archive_entry_ino(ae));
+       assertEqualIntA(a, AE_IFREG | 0400, archive_entry_mode(ae));
+       assertEqualIntA(a, 1313381406, archive_entry_mtime(ae));
+       assertEqualIntA(a, 1, archive_entry_nlink(ae));
+       assertEqualIntA(a, 0400, archive_entry_perm(ae));
+       assertEqualIntA(a, 6, archive_entry_size(ae));
+       assertEqualIntA(a, 0, archive_entry_uid(ae));
+       assertEqualStringA(a, NULL, archive_entry_uname(ae));
+       /* TODO: Verify that file contents are "hello\n" */
+
+       /* Directory "C" */
        assertEqualIntA(a, ARCHIVE_OK,
            archive_read_next_header(a, &ae));
        assertEqualString("C", archive_entry_pathname(ae));
+       assertEqualIntA(a, 1313381411, archive_entry_atime(ae));
+       assertEqualIntA(a, 0, archive_entry_birthtime(ae));
+       assertEqualIntA(a, 1313381411, archive_entry_ctime(ae));
+       assertEqualIntA(a, 0, archive_entry_dev(ae));
+       assertEqualIntA(a, AE_IFDIR, archive_entry_filetype(ae));
+       assertEqualIntA(a, 0, archive_entry_gid(ae));
+       assertEqualStringA(a, NULL, archive_entry_gname(ae));
+       assertEqualIntA(a, 0, archive_entry_ino(ae));
+       assertEqualIntA(a, AE_IFDIR | 0700, archive_entry_mode(ae));
+       assertEqualIntA(a, 1313381411, archive_entry_mtime(ae));
+       assertEqualIntA(a, 2, archive_entry_nlink(ae));
+       assertEqualIntA(a, 0700, archive_entry_perm(ae));
+       assertEqualIntA(a, 2048, archive_entry_size(ae));
+       assertEqualIntA(a, 0, archive_entry_uid(ae));
+       assertEqualStringA(a, NULL, archive_entry_uname(ae));
+
+       /* File "C/D" */
        assertEqualIntA(a, ARCHIVE_OK,
            archive_read_next_header(a, &ae));
        assertEqualString("C/D", archive_entry_pathname(ae));
+       assertEqualIntA(a, 1313381411, archive_entry_atime(ae));
+       assertEqualIntA(a, 0, archive_entry_birthtime(ae));
+       assertEqualIntA(a, 1313381411, archive_entry_ctime(ae));
+       assertEqualIntA(a, 0, archive_entry_dev(ae));
+       assertEqualIntA(a, AE_IFREG, archive_entry_filetype(ae));
+       assertEqualIntA(a, 0, archive_entry_gid(ae));
+       assertEqualStringA(a, NULL, archive_entry_gname(ae));
+       assertEqualIntA(a, 0, archive_entry_ino(ae));
+       assertEqualIntA(a, AE_IFREG | 0400, archive_entry_mode(ae));
+       assertEqualIntA(a, 1313381411, archive_entry_mtime(ae));
+       assertEqualIntA(a, 1, archive_entry_nlink(ae));
+       assertEqualIntA(a, 0400, archive_entry_perm(ae));
+       assertEqualIntA(a, 6, archive_entry_size(ae));
+       assertEqualIntA(a, 0, archive_entry_uid(ae));
+       assertEqualStringA(a, NULL, archive_entry_uname(ae));
+       /* TODO: Verify that file contents are "hello\n" */
+
+       /* Final statistics */
        assertEqualIntA(a, ARCHIVE_EOF,
            archive_read_next_header(a, &ae));
        assertEqualInt(5, archive_file_count(a));