diff --git a/tsk/auto/auto.cpp b/tsk/auto/auto.cpp index ce95297129d4eaf6e98b933303b290c745b62788..af43d445a4c3f7c1bb07278f2a4fe9e133afd22a 100644 --- a/tsk/auto/auto.cpp +++ b/tsk/auto/auto.cpp @@ -255,9 +255,8 @@ TSK_WALK_RET_ENUM return TSK_WALK_STOP; // process it - TSK_RETVAL_ENUM retval2 = - tsk->findFilesInFsRet(a_vs_part->start * - a_vs_part->vs->block_size, TSK_FS_TYPE_DETECT); + TSK_RETVAL_ENUM retval2 = tsk->findFilesInFsRet( + a_vs_part->start * a_vs_part->vs->block_size, TSK_FS_TYPE_DETECT); if ((retval2 == TSK_STOP) || (tsk->getStopProcessing())) { return TSK_WALK_STOP; } @@ -360,8 +359,10 @@ TSK_RETVAL_ENUM return TSK_ERR; } else if (getCurVsPartFlag() & TSK_VS_PART_FLAG_ALLOC) { - tsk_error_set_errstr2 ("Sector offset: %" PRIuOFF ", Partition Type: %s", - a_start/512, getCurVsPartDescr().c_str() ); + tsk_error_set_errstr2 ( + "Sector offset: %" PRIuOFF ", Partition Type: %s", + a_start/512, getCurVsPartDescr().c_str() + ); registerError(); return TSK_ERR; } diff --git a/tsk/fs/ffs.c b/tsk/fs/ffs.c index 5b7116c512bf11611f550370b07c2b3546b8d1fc..df48ccb2ac3e7ba03b668d36762dfbd53f348cc8 100644 --- a/tsk/fs/ffs.c +++ b/tsk/fs/ffs.c @@ -1980,7 +1980,7 @@ ffs_close(TSK_FS_INFO * fs) * @returns NULL on error or if data is not a FFS file system */ TSK_FS_INFO * -ffs_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset, TSK_FS_TYPE_ENUM ftype) +ffs_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset, TSK_FS_TYPE_ENUM ftype, uint8_t test) { char *myname = "ffs_open"; FFS_INFO *ffs; diff --git a/tsk/fs/fs_open.c b/tsk/fs/fs_open.c index f59344332e6994c8bab7bcceadc73b84dacb240e..056683a51d8e80db9751164dc79a3d5c11a931a6 100644 --- a/tsk/fs/fs_open.c +++ b/tsk/fs/fs_open.c @@ -94,151 +94,64 @@ tsk_fs_open_img(TSK_IMG_INFO * a_img_info, TSK_OFF_T a_offset, * We need to try all of them in case more than one matches */ if (a_ftype == TSK_FS_TYPE_DETECT) { - TSK_FS_INFO *fs_info, *fs_set = NULL; - char *set = NULL; + TSK_FS_INFO *fs_info, *fs_first = NULL; + const char *name_first; if (tsk_verbose) tsk_fprintf(stderr, "fsopen: Auto detection mode at offset %" PRIuOFF "\n", a_offset); - if ((fs_info = - ntfs_open(a_img_info, a_offset, TSK_FS_TYPE_NTFS_DETECT, - 1)) != NULL) { - set = "NTFS"; - fs_set = fs_info; - } - else { - tsk_error_reset(); - } - - if ((fs_info = - fatfs_open(a_img_info, a_offset, TSK_FS_TYPE_FAT_DETECT, - 1)) != NULL) { - if (set == NULL) { - set = "FAT"; - fs_set = fs_info; - } - else { - fs_set->close(fs_set); - fs_info->close(fs_info); - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_FS_UNKTYPE); - tsk_error_set_errstr("FAT or %s", set); - return NULL; - } - } - else { - tsk_error_reset(); - } - - if ((fs_info = - ext2fs_open(a_img_info, a_offset, TSK_FS_TYPE_EXT_DETECT, - 1)) != NULL) { - if (set == NULL) { - set = "EXT2/3"; - fs_set = fs_info; - } - else { - fs_set->close(fs_set); - fs_info->close(fs_info); - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_FS_UNKTYPE); - tsk_error_set_errstr("EXT2/3 or %s", set); - return NULL; - } - } - else { - tsk_error_reset(); - } - - if ((fs_info = - ffs_open(a_img_info, a_offset, - TSK_FS_TYPE_FFS_DETECT)) != NULL) { - if (set == NULL) { - set = "UFS"; - fs_set = fs_info; - } - else { - fs_set->close(fs_set); - fs_info->close(fs_info); - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_FS_UNKTYPE); - tsk_error_set_errstr("UFS or %s", set); - return NULL; - } - } - else { - tsk_error_reset(); - } - - if ((fs_info = - yaffs2_open(a_img_info, a_offset, - TSK_FS_TYPE_YAFFS2_DETECT, 1)) != NULL) { - if (set == NULL) { - set = "YAFFS2"; - fs_set = fs_info; - } - else { - fs_set->close(fs_set); - fs_info->close(fs_info); - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_FS_UNKTYPE); - tsk_error_set_errstr("YAFFS2 or %s", set); - return NULL; - } - } - else { - tsk_error_reset(); - } - - + const struct { + char* name; + TSK_FS_INFO* (*open)(TSK_IMG_INFO*, TSK_OFF_T, + TSK_FS_TYPE_ENUM, uint8_t); + TSK_FS_TYPE_ENUM type; + } FS_OPENERS[] = { + { "NTFS", ntfs_open, TSK_FS_TYPE_NTFS_DETECT }, + { "FAT", fatfs_open, TSK_FS_TYPE_FAT_DETECT }, + { "EXT2/3/4", ext2fs_open, TSK_FS_TYPE_EXT_DETECT }, + { "UFS", ffs_open, TSK_FS_TYPE_FFS_DETECT }, + { "YAFFS2", yaffs2_open, TSK_FS_TYPE_YAFFS2_DETECT }, #if TSK_USE_HFS - if ((fs_info = - hfs_open(a_img_info, a_offset, TSK_FS_TYPE_HFS_DETECT, - 1)) != NULL) { - if (set == NULL) { - set = "HFS"; - fs_set = fs_info; + { "HFS", hfs_open, TSK_FS_TYPE_HFS_DETECT }, +#endif + { "ISO9660", iso9660_open, TSK_FS_TYPE_ISO9660_DETECT } + }; + + for (int i = 0; i < sizeof(FS_OPENERS)/sizeof(FS_OPENERS[0]); ++i) { + if ((fs_info = FS_OPENERS[i].open( + a_img_info, a_offset, FS_OPENERS[i].type, 1)) != NULL) { + // fs opens as type i + if (fs_first == NULL) { + // first success opening fs + name_first = FS_OPENERS[i].name; + fs_first = fs_info; + } + else { + // second success opening fs, which means we + // cannot autodetect the fs type and must give up + fs_first->close(fs_first); + fs_info->close(fs_info); + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_UNKTYPE); + tsk_error_set_errstr( + "%s or %s", FS_OPENERS[i].name, name_first); + return NULL; + } } else { - fs_set->close(fs_set); - fs_info->close(fs_info); + // fs does not open as type i tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_FS_UNKTYPE); - tsk_error_set_errstr("HFS or %s", set); - return NULL; } } - else { - tsk_error_reset(); - } -#endif - - if ((fs_info = - iso9660_open(a_img_info, a_offset, - TSK_FS_TYPE_ISO9660_DETECT, 1)) != NULL) { - if (set != NULL) { - fs_set->close(fs_set); - fs_info->close(fs_info); - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_FS_UNKTYPE); - tsk_error_set_errstr("ISO9660 or %s", set); - return NULL; - } - fs_set = fs_info; - } - else { - tsk_error_reset(); - } - - if (fs_set == NULL) { + if (fs_first == NULL) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_FS_UNKTYPE); - return NULL; } - return fs_set; + + return fs_first; } else { if (TSK_FS_TYPE_ISNTFS(a_ftype)) @@ -246,7 +159,7 @@ tsk_fs_open_img(TSK_IMG_INFO * a_img_info, TSK_OFF_T a_offset, else if (TSK_FS_TYPE_ISFAT(a_ftype)) return fatfs_open(a_img_info, a_offset, a_ftype, 0); else if (TSK_FS_TYPE_ISFFS(a_ftype)) - return ffs_open(a_img_info, a_offset, a_ftype); + return ffs_open(a_img_info, a_offset, a_ftype, 0); else if (TSK_FS_TYPE_ISEXT(a_ftype)) return ext2fs_open(a_img_info, a_offset, a_ftype, 0); else if (TSK_FS_TYPE_ISHFS(a_ftype)) diff --git a/tsk/fs/tsk_fs_i.h b/tsk/fs/tsk_fs_i.h index c0c4faa2822af03b82186e03fe733629014ffcd7..43609ab068203951dc4c97bd0e796847e388decf 100644 --- a/tsk/fs/tsk_fs_i.h +++ b/tsk/fs/tsk_fs_i.h @@ -187,7 +187,7 @@ extern "C" { extern TSK_FS_INFO *fatfs_open(TSK_IMG_INFO *, TSK_OFF_T, TSK_FS_TYPE_ENUM, uint8_t); extern TSK_FS_INFO *ffs_open(TSK_IMG_INFO *, TSK_OFF_T, - TSK_FS_TYPE_ENUM); + TSK_FS_TYPE_ENUM, uint8_t); extern TSK_FS_INFO *ntfs_open(TSK_IMG_INFO *, TSK_OFF_T, TSK_FS_TYPE_ENUM, uint8_t); extern TSK_FS_INFO *rawfs_open(TSK_IMG_INFO *, TSK_OFF_T); diff --git a/tsk/vs/mm_part.c b/tsk/vs/mm_part.c index cb65ea6a294e080b7128f24582c5e6a61acf17c4..6ee01dc4c3d42cff1e2528c2c6cc32b3b690cb2b 100644 --- a/tsk/vs/mm_part.c +++ b/tsk/vs/mm_part.c @@ -272,13 +272,9 @@ tsk_vs_part_walk(TSK_VS_INFO * a_vs, TSK_PNUM_T a_start, TSK_PNUM_T a_last, for (part = a_vs->part_list; part != NULL; part = part->next) { if ((part->addr >= a_start) && ((part->flags & a_flags) != 0)) { - int retval; - retval = a_action(a_vs, part, a_ptr); - if (retval == TSK_WALK_STOP) { - return 0; - } - else if (retval == TSK_WALK_ERROR) { - return 1; + switch (a_action(a_vs, part, a_ptr)) { + case TSK_WALK_STOP: return 0; + case TSK_WALK_ERROR: return 1; } }