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:
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);
|
||||
}
|
||||
Reference in new issue
Block a user