From: i1011 Date: Sun, 7 Jun 2026 12:50:31 +0000 (+0800) Subject: iso9660: Add symlink name length enumeration test X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=9cbb26c09b28f61b441028fa571f3ec1480edbfe;p=thirdparty%2Flibarchive.git iso9660: Add symlink name length enumeration test --- diff --git a/libarchive/test/test_write_format_iso9660_bugs.c b/libarchive/test/test_write_format_iso9660_bugs.c index 7967fab06..24f4d3734 100644 --- a/libarchive/test/test_write_format_iso9660_bugs.c +++ b/libarchive/test/test_write_format_iso9660_bugs.c @@ -246,3 +246,60 @@ DEFINE_TEST(test_write_format_iso9660_duplicate_identifier_truncation) assertEqualInt(ARCHIVE_OK, archive_write_free(a)); free(buff); } + + +DEFINE_TEST(test_write_format_iso9660_symlink) +{ + const size_t buffsize = 512 * 1024; + unsigned char *buff; + size_t used = 0; + char name[1024]; + struct archive *a; + struct archive_entry *ae; + + assert((buff = malloc(buffsize)) != NULL); + for (size_t i = 0; i + 1 < sizeof(name); i++) { + /* Write the archive */ + assert((a = archive_write_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_write_set_format_iso9660(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_write_add_filter_none(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_write_open_memory(a, buff, buffsize, &used)); + assert((ae = archive_entry_new()) != NULL); + name[i] = 'A'; + name[i + 1] = '\0'; + archive_entry_copy_pathname(ae, name); + archive_entry_set_filetype(ae, AE_IFLNK); + archive_entry_set_symlink(ae, "B"); + archive_entry_set_size(ae, 0); + assertEqualIntA(a, ARCHIVE_OK, archive_write_header(a, ae)); + archive_entry_free(ae); + assertEqualIntA(a, ARCHIVE_OK, archive_write_close(a)); + assertEqualInt(ARCHIVE_OK, archive_write_free(a)); + + /* Read the archive back */ + assert((a = archive_read_new()) != NULL); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_format_all(a)); + assertEqualIntA(a, ARCHIVE_OK, archive_read_support_filter_all(a)); + assertEqualIntA(a, ARCHIVE_OK, + archive_read_open_memory(a, buff, used)); + + /* First entry: the root directory '.' */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualStringA(a, ".", archive_entry_pathname(ae)); + assertEqualIntA(a, AE_IFDIR, archive_entry_filetype(ae)); + + /* Second entry: the symbolic link */ + assertEqualIntA(a, ARCHIVE_OK, archive_read_next_header(a, &ae)); + assertEqualStringA(a, name, archive_entry_pathname(ae)); + assertEqualIntA(a, AE_IFLNK, archive_entry_filetype(ae)); + assertEqualStringA(a, "B", archive_entry_symlink(ae)); + assertEqualIntA(a, 0, archive_entry_size(ae)); + + /* End of archive */ + 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(buff); +}