diff --git a/tsk/fs/ext2fs.c b/tsk/fs/ext2fs.c index d1d7553755cc06c0b0855fd7506d185e66c07e2f..7feec481060fea23a2078a656052fea83a982062 100644 --- a/tsk/fs/ext2fs.c +++ b/tsk/fs/ext2fs.c @@ -3160,6 +3160,13 @@ ext2fs_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset, return NULL; } + if (img_info->sector_size == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ARG); + tsk_error_set_errstr("ext2fs_open: sector size is 0"); + return NULL; + } + if ((ext2fs = (EXT2FS_INFO *) tsk_fs_malloc(sizeof(*ext2fs))) == NULL) return NULL; diff --git a/tsk/fs/fatfs.c b/tsk/fs/fatfs.c index f368f64fd07b36b1a582c90045c29db3e39044e7..d26f259cd3bf2f3e5a1c89f86feacce5c6456562 100644 --- a/tsk/fs/fatfs.c +++ b/tsk/fs/fatfs.c @@ -48,6 +48,13 @@ fatfs_open(TSK_IMG_INFO *a_img_info, TSK_OFF_T a_offset, TSK_FS_TYPE_ENUM a_ftyp return NULL; } + if (a_img_info->sector_size == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ARG); + tsk_error_set_errstr("fatfs_open: sector size is 0"); + return NULL; + } + // Allocate an FATFS_INFO and initialize its generic TSK_FS_INFO members. if ((fatfs = (FATFS_INFO*)tsk_fs_malloc(sizeof(FATFS_INFO))) == NULL) { return NULL; diff --git a/tsk/fs/ffs.c b/tsk/fs/ffs.c index 44cd1eed0f307c8e15070c79cc2b690287b4f9b1..fd2e6ca6aba95ecaa7c04d15b4bd451ca1a2c7ce 100644 --- a/tsk/fs/ffs.c +++ b/tsk/fs/ffs.c @@ -2019,6 +2019,13 @@ ffs_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset, TSK_FS_TYPE_ENUM ftype, uint return NULL; } + if (img_info->sector_size == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ARG); + tsk_error_set_errstr("ffs_open: sector size is 0"); + return NULL; + } + if ((ffs = (FFS_INFO *) tsk_fs_malloc(sizeof(*ffs))) == NULL) return NULL; diff --git a/tsk/fs/iso9660.c b/tsk/fs/iso9660.c index 8232d3e5b840fd5b414868dc97c3144d9913d3cb..4d4684974af6e6e4ecf5fbbbcd99b6dc7e187444 100644 --- a/tsk/fs/iso9660.c +++ b/tsk/fs/iso9660.c @@ -639,7 +639,7 @@ iso9660_load_inodes_dir(TSK_FS_INFO * fs, TSK_OFF_T a_offs, int count, in_node->offset = tsk_getu32(fs->endian, dentry->ext_loc_m) * fs->block_size; - if (tsk_getu32(fs->endian, in_node->inode.dr.data_len_m) + in_node->offset > fs->block_count * fs->block_size) { + if (tsk_getu32(fs->endian, in_node->inode.dr.data_len_m) + in_node->offset > (TSK_OFF_T)(fs->block_count * fs->block_size)) { if (tsk_verbose) tsk_fprintf(stderr, "iso9660_load_inodes_dir: file ends past end of image (%"PRIu32" bytes). bailing\n", @@ -2505,6 +2505,13 @@ iso9660_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset, return NULL; } + if (img_info->sector_size == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ARG); + tsk_error_set_errstr("iso9660_open: sector size is 0"); + return NULL; + } + if (tsk_verbose) { tsk_fprintf(stderr, "iso9660_open img_info: %" PRIu64 " ftype: %" PRIu8 " test: %" PRIu8 "\n", (uint64_t) img_info, diff --git a/tsk/fs/ntfs.c b/tsk/fs/ntfs.c index a68f8897123738a235c86b2de3c134de619bbc36..c42cdfb001f7dde5a62a2d04163efdef820ad259 100755 --- a/tsk/fs/ntfs.c +++ b/tsk/fs/ntfs.c @@ -4837,6 +4837,13 @@ ntfs_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset, return NULL; } + if (img_info->sector_size == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ARG); + tsk_error_set_str("ntfs_open: sector size is 0"); + return NULL; + } + if ((ntfs = (NTFS_INFO *) tsk_fs_malloc(sizeof(*ntfs))) == NULL) { goto on_error; } diff --git a/tsk/fs/rawfs.c b/tsk/fs/rawfs.c index 79142761d4052b950d022bb05519473c9204105a..c38a09b4660d94d5f3c5dce9708454190f192de9 100644 --- a/tsk/fs/rawfs.c +++ b/tsk/fs/rawfs.c @@ -41,6 +41,13 @@ rawfs_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset) // clean up any error messages that are lying around tsk_error_reset(); + if (img_info->sector_size == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ARG); + tsk_error_set_errstr("rawfs_open: sector size is 0"); + return NULL; + } + fs = (TSK_FS_INFO *) tsk_fs_malloc(sizeof(TSK_FS_INFO)); if (fs == NULL) return NULL; diff --git a/tsk/fs/swapfs.c b/tsk/fs/swapfs.c index 722d2636bb29d3bfde0715059e0b032cb9d15d4a..1b6e4c322705eb2e56b98d2eee990d87b8f8b5c7 100644 --- a/tsk/fs/swapfs.c +++ b/tsk/fs/swapfs.c @@ -40,6 +40,13 @@ swapfs_open(TSK_IMG_INFO * img_info, TSK_OFF_T offset) // clean up any error messages that are lying around tsk_error_reset(); + if (img_info->sector_size == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ARG); + tsk_error_set_errstr("swapfs_open: sector size is 0"); + return NULL; + } + fs = (TSK_FS_INFO *) tsk_fs_malloc(sizeof(*fs)); if (fs == NULL) return NULL; diff --git a/tsk/fs/yaffs.cpp b/tsk/fs/yaffs.cpp index 3cb74580e8f54dfd16fa0e02d26103ce71272674..9cbc0058e4423463efc67cd5e8f9cdce2d53db78 100644 --- a/tsk/fs/yaffs.cpp +++ b/tsk/fs/yaffs.cpp @@ -3010,6 +3010,15 @@ TSK_FS_INFO * return NULL; } + if (img_info->sector_size == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_FS_ARG); + tsk_error_set_errstr("yaffs2_open: sector size is 0"); + return NULL; + } + + + if ((yaffsfs = (YAFFSFS_INFO *) tsk_fs_malloc(sizeof(YAFFSFS_INFO))) == NULL) return NULL; yaffsfs->cache_objects = NULL; diff --git a/tsk/vs/bsd.c b/tsk/vs/bsd.c index d04e7e33c9a2a2a52677c30cd1ec08ad0d0ffb56..fd94d292f9d955b52ed939c0b043d8803f03dd21 100644 --- a/tsk/vs/bsd.c +++ b/tsk/vs/bsd.c @@ -219,6 +219,13 @@ tsk_vs_bsd_open(TSK_IMG_INFO * img_info, TSK_DADDR_T offset) // clean up any errors that are lying around tsk_error_reset(); + if (img_info->sector_size == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_VS_ARG); + tsk_error_set_errstr("tsk_vs_bsd_open: sector size is 0"); + return NULL; + } + vs = (TSK_VS_INFO *) tsk_malloc(sizeof(*vs)); if (vs == NULL) return NULL; diff --git a/tsk/vs/dos.c b/tsk/vs/dos.c index 3a3bcf677d215d87a076fb45c72fbb3610c6625b..06e95027b08fca922967b3f86e297d9c3282eca4 100644 --- a/tsk/vs/dos.c +++ b/tsk/vs/dos.c @@ -1042,6 +1042,13 @@ tsk_vs_dos_open(TSK_IMG_INFO * img_info, TSK_DADDR_T offset, uint8_t test) // clean up any errors that are lying around tsk_error_reset(); + if (img_info->sector_size == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_VS_ARG); + tsk_error_set_errstr("tsk_vs_dos_open: sector size is 0"); + return NULL; + } + vs = (TSK_VS_INFO *) tsk_malloc(sizeof(*vs)); if (vs == NULL) return NULL; @@ -1057,6 +1064,7 @@ tsk_vs_dos_open(TSK_IMG_INFO * img_info, TSK_DADDR_T offset, uint8_t test) vs->part_count = 0; vs->endian = 0; vs->block_size = img_info->sector_size; + /* Assign functions */ vs->close = dos_close; diff --git a/tsk/vs/gpt.c b/tsk/vs/gpt.c index 67ea92e6e3ac1d0609a79636021b7c9a00319d39..6a1ba05e2a6a3308c7cf0cc2580b0c7b89b851e5 100644 --- a/tsk/vs/gpt.c +++ b/tsk/vs/gpt.c @@ -309,6 +309,13 @@ tsk_vs_gpt_open(TSK_IMG_INFO * img_info, TSK_DADDR_T offset) // clean up any errors that are lying around tsk_error_reset(); + if (img_info->sector_size == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_VS_ARG); + tsk_error_set_errstr("tsk_vs_gpt_open: sector size is 0"); + return NULL; + } + vs = (TSK_VS_INFO *) tsk_malloc(sizeof(*vs)); if (vs == NULL) return NULL; diff --git a/tsk/vs/mac.c b/tsk/vs/mac.c index d37443eefa9c6989aeafe15b098b514f051e00fb..8853165c2a62f486cf06ee106af4c40771300054 100644 --- a/tsk/vs/mac.c +++ b/tsk/vs/mac.c @@ -195,6 +195,13 @@ tsk_vs_mac_open(TSK_IMG_INFO * img_info, TSK_DADDR_T offset) // clean up any errors that are lying around tsk_error_reset(); + if (img_info->sector_size == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_VS_ARG); + tsk_error_set_errstr("tsk_vs_mac_open: sector size is 0"); + return NULL; + } + vs = (TSK_VS_INFO *) tsk_malloc(sizeof(*vs)); if (vs == NULL) return NULL; diff --git a/tsk/vs/sun.c b/tsk/vs/sun.c index f10097f0f6444e5b84145771339968fdc0564d61..8371cfff828916c6d900ccb86d55164c8e2b24b1 100644 --- a/tsk/vs/sun.c +++ b/tsk/vs/sun.c @@ -358,6 +358,13 @@ tsk_vs_sun_open(TSK_IMG_INFO * img_info, TSK_DADDR_T offset) // clean up any errors that are lying around tsk_error_reset(); + if (img_info->sector_size == 0) { + tsk_error_reset(); + tsk_error_set_errno(TSK_ERR_VS_ARG); + tsk_error_set_errstr("tsk_vs_sun_open: sector size is 0"); + return NULL; + } + vs = (TSK_VS_INFO *) tsk_malloc(sizeof(*vs)); if (vs == NULL) return NULL;