Merge pull request #3117 from i1011/iso9660-null-deref-fix

iso9660: Fix null dereference in set_directory_record_rr
(cherry picked from commit aff2e9d8d9)
This commit is contained in:
Dustin L. Howett authored and Martin Matuska committed 2026-06-23 10:59:51 +02:00
1 parent 7621c6d489
commit 86762e4164
2 files changed
+59 -2

No files matched your search

@@ -3039,8 +3039,8 @@ set_directory_record_rr(unsigned char *bp, int dr_len,
const char *sl;
char sl_last;
if (extra_space(&ctl) < 7)
bp = extra_next_record(&ctl, 7);
if (extra_space(&ctl) < 12)
bp = extra_next_record(&ctl, 12);
sl = file->symlink.s;
sl_last = '\0';
if (bp != NULL) {
@@ -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);
}