From d10857039edb66fe2869bc87f833113ad56e26e7 Mon Sep 17 00:00:00 2001 From: Brian Carrier <carrier@sleuthkit.org> Date: Fri, 15 Sep 2017 11:26:24 -0400 Subject: [PATCH] Added sector_size 0 checks before using img_info. Fixes: #953 --- tsk/fs/ext2fs.c | 7 +++++++ tsk/fs/fatfs.c | 7 +++++++ tsk/fs/ffs.c | 7 +++++++ tsk/fs/iso9660.c | 9 ++++++++- tsk/fs/ntfs.c | 7 +++++++ tsk/fs/rawfs.c | 7 +++++++ tsk/fs/swapfs.c | 7 +++++++ tsk/fs/yaffs.cpp | 9 +++++++++ tsk/vs/bsd.c | 7 +++++++ tsk/vs/dos.c | 8 ++++++++ tsk/vs/gpt.c | 7 +++++++ tsk/vs/mac.c | 7 +++++++ tsk/vs/sun.c | 7 +++++++ 13 files changed, 95 insertions(+), 1 deletion(-) diff --git a/tsk/fs/ext2fs.c b/tsk/fs/ext2fs.c index d1d755375..7feec4810 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 f368f64fd..d26f259cd 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 44cd1eed0..fd2e6ca6a 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 8232d3e5b..4d4684974 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 a68f88971..c42cdfb00 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 79142761d..c38a09b46 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 722d2636b..1b6e4c322 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 3cb74580e..9cbc0058e 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 d04e7e33c..fd94d292f 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 3a3bcf677..06e95027b 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 67ea92e6e..6a1ba05e2 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 d37443eef..8853165c2 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 f10097f0f..8371cfff8 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; -- GitLab