diff --git a/tsk/fs/yaffs.cpp b/tsk/fs/yaffs.cpp index f7492ed0dbd14d068a238ff70f9872720f4fd0f4..77f3539721cb2c68f8b1fc8d859ee8273b83798b 100644 --- a/tsk/fs/yaffs.cpp +++ b/tsk/fs/yaffs.cpp @@ -2639,6 +2639,8 @@ TSK_FS_INFO * yaffsfs->page_size = psize == 0 ? YAFFS_DEFAULT_PAGE_SIZE : psize; yaffsfs->spare_size = ssize == 0 ? YAFFS_DEFAULT_SPARE_SIZE : ssize; yaffsfs->chunks_per_block = 64; + // TODO: Why are 2 different memory allocation methods used in the same code? + // This make things unnecessary complex. yaffsfs->chunkMap = new std::map<uint32_t, YaffsCacheChunkGroup>; yaffsfs->max_obj_id = 1; yaffsfs->max_version = 0; @@ -2667,7 +2669,7 @@ TSK_FS_INFO * tsk_error_set_errstr("not a YAFFS file system (bad spare format)"); if (tsk_verbose) fprintf(stderr, "yaffsfs_open: could not find valid spare area format\n"); - return NULL; + goto on_error; } /* @@ -2682,9 +2684,10 @@ TSK_FS_INFO * tsk_error_set_errstr("not a YAFFS file system (first record)"); if (tsk_verbose) fprintf(stderr, "yaffsfs_open: invalid first record\n"); - return NULL; + goto on_error; } free(first_header); + first_header = NULL; fs->duname = "Chunk"; @@ -2766,5 +2769,18 @@ TSK_FS_INFO * tsk_fs_dir_close(test_dir); return fs; + +on_error: + // Make sure to free yaffsfs here otherwise it will leak + if( yaffsfs != NULL ) { + // TODO: where is chunkMap freed in normal operations? + if( yaffsfs->chunkMap != NULL ) { + yaffsfs->chunkMap->clear(); + + delete yaffsfs->chunkMap; + } + free( yaffsfs ); + } + return NULL; }