From 09325d3a9d5e2ac5727d7dad5b3c254d02cc4b9c Mon Sep 17 00:00:00 2001 From: Tim Kientzle Date: Sat, 6 Jul 2024 00:45:38 -0700 Subject: [PATCH] Fix a minor date-parsing bug and fill in missing ISO9660 testing (#2260) 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. --- .../archive_read_support_format_iso9660.c | 2 +- libarchive/test/test_read_format_iso_Z.c | 110 ++++++++++++++++++ 2 files changed, 111 insertions(+), 1 deletion(-) diff --git a/libarchive/archive_read_support_format_iso9660.c b/libarchive/archive_read_support_format_iso9660.c index c38943a2f..056beb5ff 100644 --- a/libarchive/archive_read_support_format_iso9660.c +++ b/libarchive/archive_read_support_format_iso9660.c @@ -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'); diff --git a/libarchive/test/test_read_format_iso_Z.c b/libarchive/test/test_read_format_iso_Z.c index 785b00bf8..d07bc1bc8 100644 --- a/libarchive/test/test_read_format_iso_Z.c +++ b/libarchive/test/test_read_format_iso_Z.c @@ -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)); -- 2.47.2