Skip to content

Commit 6f1d635

Browse files
SciresMfincs
authored andcommitted
build_romfs: fix use-after-free in romfs building
1 parent f6561ef commit 6f1d635

1 file changed

Lines changed: 17 additions & 3 deletions

File tree

src/romfs.c

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -410,9 +410,7 @@ size_t build_romfs_into_file(filepath_t *in_dirpath, FILE *f_out, off_t base_off
410410
cur_entry->name_size = name_size;
411411
memcpy(cur_entry->name, cur_dir->cur_path.char_path + 1, name_size);
412412

413-
romfs_dirent_ctx_t *temp = cur_dir;
414413
cur_dir = cur_dir->next;
415-
free(temp);
416414
}
417415

418416
header.header_size = le_dword(sizeof(header));
@@ -474,11 +472,27 @@ size_t build_romfs_into_file(filepath_t *in_dirpath, FILE *f_out, off_t base_off
474472

475473
os_fclose(f_in);
476474

475+
cur_file = cur_file->next;
476+
}
477+
free(buffer);
478+
479+
/* Free all files. */
480+
cur_file = romfs_ctx.files;
481+
while (cur_file != NULL) {
477482
romfs_fent_ctx_t *temp = cur_file;
478483
cur_file = cur_file->next;
479484
free(temp);
480485
}
481-
free(buffer);
486+
romfs_ctx.files = NULL;
487+
488+
/* Free all directories. */
489+
cur_dir = root_ctx;
490+
while (cur_dir != NULL) {
491+
romfs_dirent_ctx_t *temp = cur_dir;
492+
cur_dir = cur_dir->next;
493+
free(temp);
494+
}
495+
root_ctx = NULL;
482496

483497
fseeko64(f_out, base_offset + dir_hash_table_ofs, SEEK_SET);
484498
if (fwrite(dir_hash_table, 1, romfs_ctx.dir_hash_table_size, f_out) != romfs_ctx.dir_hash_table_size) {

0 commit comments

Comments
 (0)