diff -Nur sleuthkit-4.6.7/tsk/fs/ext2fs.c sleuthkit-4.6.7.new/tsk/fs/ext2fs.c --- sleuthkit-4.6.7/tsk/fs/ext2fs.c 2020-12-16 14:43:46.929902964 +0800 +++ sleuthkit-4.6.7.new/tsk/fs/ext2fs.c 2020-12-16 14:54:44.211056190 +0800 @@ -1021,8 +1021,10 @@ if ((fs_file = tsk_fs_file_alloc(fs)) == NULL) return 1; if ((fs_file->meta = - tsk_fs_meta_alloc(EXT2FS_FILE_CONTENT_LEN)) == NULL) + tsk_fs_meta_alloc(EXT2FS_FILE_CONTENT_LEN)) == NULL) { + tsk_fs_file_close(fs_file); return 1; + } // we need to handle fs->last_inum specially because it is for the // virtual ORPHANS directory. Handle it outside of the loop. @@ -1038,6 +1040,7 @@ ext2fs->inode_size > sizeof(ext2fs_inode) ? ext2fs->inode_size : sizeof(ext2fs_inode); if ((dino_buf = (ext2fs_inode *) tsk_malloc(size)) == NULL) { + tsk_fs_file_close(fs_file); return 1; } @@ -1058,6 +1061,7 @@ if (ext2fs_imap_load(ext2fs, grp_num)) { tsk_release_lock(&ext2fs->lock); + tsk_fs_file_close(fs_file); free(dino_buf); return 1; } @@ -1068,8 +1072,9 @@ /* * Ensure that inum - ibase refers to a valid bit offset in imap_buf. */ - if ((inum - ibase) > fs->block_size*8) { + if ((inum - ibase) >= fs->block_size*8) { tsk_release_lock(&ext2fs->lock); + tsk_fs_file_close(fs_file); free(dino_buf); tsk_error_reset(); tsk_error_set_errno(TSK_ERR_FS_WALK_RNG); @@ -1120,7 +1125,7 @@ * to the application. */ if (ext2fs_dinode_copy(ext2fs, fs_file->meta, inum, dino_buf)) { - tsk_fs_meta_close(fs_file->meta); + tsk_fs_file_close(fs_file); free(dino_buf); return 1; } diff -Nur sleuthkit-4.6.7/tsk/fs/unix_misc.c sleuthkit-4.6.7.new/tsk/fs/unix_misc.c --- sleuthkit-4.6.7/tsk/fs/unix_misc.c 2019-08-03 04:20:57.000000000 +0800 +++ sleuthkit-4.6.7.new/tsk/fs/unix_misc.c 2020-12-16 14:56:46.852764086 +0800 @@ -180,6 +180,7 @@ } tsk_error_set_errstr2("unix_make_data_run_indir: Block %" PRIuDADDR, addr); + free(data_run); return -1; } }