diff --git a/tsk/fs/yaffs.cpp b/tsk/fs/yaffs.cpp index 6756b0cc9461e63a5663d531cc8dc01965058a5e..ae61a2976eb582aa4e2f50962afe3f7db1132310 100644 --- a/tsk/fs/yaffs.cpp +++ b/tsk/fs/yaffs.cpp @@ -728,25 +728,22 @@ static void */ static YAFFS_CONFIG_STATUS yaffs_load_config_file(TSK_IMG_INFO * a_img_info, std::map<std::string, std::string> & results){ - const TSK_TCHAR ** image_names; - int num_imgs; size_t config_file_name_len; TSK_TCHAR * config_file_name; FILE* config_file; char buf[1001]; - // Get the image name(s) - image_names = tsk_img_get_names(a_img_info, &num_imgs); - if(num_imgs < 1){ + // Ensure there is at least one image name + if(a_img_info->num_img < 1){ return YAFFS_CONFIG_ERROR; } // Construct the name of the config file from the first image name - config_file_name_len = TSTRLEN(image_names[0]); + config_file_name_len = TSTRLEN(a_img_info->images[0]); config_file_name_len += TSTRLEN(YAFFS_CONFIG_FILE_SUFFIX); config_file_name = (TSK_TCHAR *) tsk_malloc(sizeof(TSK_TCHAR) * (config_file_name_len + 1)); - TSTRNCPY(config_file_name, image_names[0], TSTRLEN(image_names[0]) + 1); + TSTRNCPY(config_file_name, a_img_info->images[0], TSTRLEN(a_img_info->images[0]) + 1); TSTRNCAT(config_file_name, YAFFS_CONFIG_FILE_SUFFIX, TSTRLEN(YAFFS_CONFIG_FILE_SUFFIX) + 1); #ifdef TSK_WIN32 diff --git a/tsk/img/aff.c b/tsk/img/aff.c index de6518d2a94cf3d5c12487d88d65b1faf2621042..fd9c4ff3c72358b8bb9e1d6abd639afac00ba3bd 100644 --- a/tsk/img/aff.c +++ b/tsk/img/aff.c @@ -216,6 +216,11 @@ aff_close(TSK_IMG_INFO * img_info) { IMG_AFF_INFO *aff_info = (IMG_AFF_INFO *) img_info; af_close(aff_info->af_file); + for (int i = 0; i < img_info->num_img; i++) { + if (img_info->images[i]) + free(img_info->images[i]); + } + free(img_info->images); tsk_img_free(aff_info); } @@ -284,6 +289,25 @@ aff_open(const TSK_TCHAR * const images[], unsigned int a_ssize) img_info->close = aff_close; img_info->imgstat = aff_imgstat; + // Save the image path in TSK_IMG_INFO - this is mostly for consistency with the other + // image types and is not currently used + img_info->num_img = 1; + img_info->images = + (TSK_TCHAR **)tsk_malloc(sizeof(TSK_TCHAR *) * img_info->num_img); + if (img_info->images == NULL) { + free(image); + return NULL; + } + size_t len = TSTRLEN(images[0]); + img_info->images[0] = + (TSK_TCHAR *)tsk_malloc(sizeof(TSK_TCHAR) * (len + 1)); + if (img_info->images[0] == NULL) { + free(img_info->images); + free(image); + return NULL; + } + TSTRNCPY(img_info->images[0], images[0], len + 1); + img_info->sector_size = 512; if (a_ssize) img_info->sector_size = a_ssize; diff --git a/tsk/img/ewf.c b/tsk/img/ewf.c index 0445db6f34db197ab61cf92c4b3874f2f5479ffd..24e83cf2b187fa047ba8d20f57c1e26fcc893a06 100644 --- a/tsk/img/ewf.c +++ b/tsk/img/ewf.c @@ -131,15 +131,15 @@ ewf_image_close(TSK_IMG_INFO * img_info) // not clear from the docs what we should do in v1... // @@@ Probably a memory leak in v1 unless libewf_close deals with it if (ewf_info->used_ewf_glob == 0) { - for (i = 0; i < ewf_info->num_imgs; i++) { - free(ewf_info->images[i]); + for (i = 0; i < ewf_info->img_info.num_img; i++) { + free(ewf_info->img_info.images[i]); } - free(ewf_info->images); + free(ewf_info->img_info.images); } else { libewf_error_t *error; #ifdef TSK_WIN32 - libewf_glob_wide_free( ewf_info->images, ewf_info->num_imgs, &error); + libewf_glob_wide_free( ewf_info->img_info.images, ewf_info->img_info.num_img, &error); #else libewf_glob_free( ewf_info->images, ewf_info->num_imgs, &error); #endif @@ -229,8 +229,8 @@ ewf_open(int a_num_img, #if defined( HAVE_LIBEWF_V2_API) #ifdef TSK_WIN32 is_error = (libewf_glob_wide(a_images[0], TSTRLEN(a_images[0]), - LIBEWF_FORMAT_UNKNOWN, &ewf_info->images, - &ewf_info->num_imgs, &ewf_error) == -1); + LIBEWF_FORMAT_UNKNOWN, &ewf_info->img_info.images, + &ewf_info->img_info.num_img, &ewf_error) == -1); #else is_error = (libewf_glob(a_images[0], TSTRLEN(a_images[0]), LIBEWF_FORMAT_UNKNOWN, &ewf_info->images, @@ -273,25 +273,25 @@ ewf_open(int a_num_img, if (tsk_verbose) tsk_fprintf(stderr, "ewf_open: found %d segment files via libewf_glob\n", - ewf_info->num_imgs); + ewf_info->img_info.num_img); } else { int i; - ewf_info->num_imgs = a_num_img; - if ((ewf_info->images = + ewf_info->img_info.num_img = a_num_img; + if ((ewf_info->img_info.images = (TSK_TCHAR **) tsk_malloc(a_num_img * sizeof(TSK_TCHAR *))) == NULL) { tsk_img_free(ewf_info); return NULL; } for (i = 0; i < a_num_img; i++) { - if ((ewf_info->images[i] = + if ((ewf_info->img_info.images[i] = (TSK_TCHAR *) tsk_malloc((TSTRLEN(a_images[i]) + 1) * sizeof(TSK_TCHAR))) == NULL) { tsk_img_free(ewf_info); return NULL; } - TSTRNCPY(ewf_info->images[i], a_images[i], + TSTRNCPY(ewf_info->img_info.images[i], a_images[i], TSTRLEN(a_images[i]) + 1); } } @@ -341,8 +341,8 @@ ewf_open(int a_num_img, } #if defined( TSK_WIN32 ) is_error = (libewf_handle_open_wide(ewf_info->handle, - (wchar_t * const *) ewf_info->images, - ewf_info->num_imgs, LIBEWF_OPEN_READ, &ewf_error) != 1); + (wchar_t * const *) ewf_info->img_info.images, + ewf_info->img_info.num_img, LIBEWF_OPEN_READ, &ewf_error) != 1); #else is_error = (libewf_handle_open(ewf_info->handle, (char *const *) ewf_info->images, diff --git a/tsk/img/ewf.h b/tsk/img/ewf.h index 15b979354cf88d3207f4755f0721ec45208c5a83..08752e14e1e91ce04f858ae092695a084c8d284d 100644 --- a/tsk/img/ewf.h +++ b/tsk/img/ewf.h @@ -38,8 +38,6 @@ extern "C" { libewf_handle_t *handle; char md5hash[33]; int md5hash_isset; - TSK_TCHAR **images; - int num_imgs; uint8_t used_ewf_glob; // 1 if libewf_glob was used during open tsk_lock_t read_lock; ///< Lock for reads since libewf is not thread safe -- only works if you have a single instance of EWF_INFO for all threads. } IMG_EWF_INFO; diff --git a/tsk/img/img_open.c b/tsk/img/img_open.c index 60d27a6481c002f1005981ce3472b273280668e7..c38f9182bd126c729407787225993f4b03edf740 100644 --- a/tsk/img/img_open.c +++ b/tsk/img/img_open.c @@ -557,52 +557,3 @@ tsk_img_close(TSK_IMG_INFO * a_img_info) tsk_deinit_lock(&(a_img_info->cache_lock)); a_img_info->close(a_img_info); } - - -/** - * \internal - * Return the list of names for this open images. - * This is sort of a hack implementation and is internal only at this - * point. Returns pointers into the IMG_INFO structs and should not be - * modified or freed. - * @param a_img_info Image to pull names from - * @param a_num_imgs Will contain number of elements in the return array. - * @returns List of names. - */ -const TSK_TCHAR ** -tsk_img_get_names(TSK_IMG_INFO *a_img_info, int *a_num_imgs) -{ - if (a_img_info == NULL) { - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_IMG_ARG); - tsk_error_set_errstr("tsk_img_get_names: IMG_INFO is NULL"); - return NULL; - } - if (a_num_imgs == NULL) { - tsk_error_reset(); - tsk_error_set_errno(TSK_ERR_IMG_ARG); - tsk_error_set_errstr("tsk_img_get_names: a_num_imgs is NULL"); - return NULL; - } - *a_num_imgs = 0; - - switch (a_img_info->itype) { - case TSK_IMG_TYPE_RAW: - { - IMG_RAW_INFO *raw_info = (IMG_RAW_INFO *)a_img_info; - *a_num_imgs = raw_info->num_img; - return raw_info->images; - } -#if HAVE_LIBEWF - case TSK_IMG_TYPE_EWF_EWF: - { - IMG_EWF_INFO *ewf_info = (IMG_EWF_INFO *)a_img_info; - *a_num_imgs = ewf_info->num_imgs; - return ewf_info->images; - } - break; -#endif - default: - return NULL; - } -} diff --git a/tsk/img/raw.c b/tsk/img/raw.c index a55e8f2d3194d9882b5693d106e5225ed702afdb..5341d9b95c1a1fc546136b576d6391b334e2917c 100644 --- a/tsk/img/raw.c +++ b/tsk/img/raw.c @@ -51,7 +51,7 @@ raw_read_segment(IMG_RAW_INFO * raw_info, int idx, char *buf, if (tsk_verbose) { tsk_fprintf(stderr, "raw_read_segment: opening file into slot %d: %" PRIttocTSK - "\n", raw_info->next_slot, raw_info->images[idx]); + "\n", raw_info->next_slot, raw_info->img_info.images[idx]); } /* Grab the next cache slot */ @@ -62,7 +62,7 @@ raw_read_segment(IMG_RAW_INFO * raw_info, int idx, char *buf, if (tsk_verbose) { tsk_fprintf(stderr, "raw_read_segment: closing file %" PRIttocTSK "\n", - raw_info->images[cimg->image]); + raw_info->img_info.images[cimg->image]); } #ifdef TSK_WIN32 CloseHandle(cimg->fd); @@ -73,7 +73,7 @@ raw_read_segment(IMG_RAW_INFO * raw_info, int idx, char *buf, } #ifdef TSK_WIN32 - cimg->fd = CreateFile(raw_info->images[idx], FILE_READ_DATA, + cimg->fd = CreateFile(raw_info->img_info.images[idx], FILE_READ_DATA, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, 0, NULL); if ( cimg->fd == INVALID_HANDLE_VALUE ) { @@ -82,7 +82,7 @@ raw_read_segment(IMG_RAW_INFO * raw_info, int idx, char *buf, tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_OPEN); tsk_error_set_errstr("raw_read: file \"%" PRIttocTSK - "\" - %d", raw_info->images[idx], lastError); + "\" - %d", raw_info->img_info.images[idx], lastError); return -1; } @@ -126,7 +126,7 @@ raw_read_segment(IMG_RAW_INFO * raw_info, int idx, char *buf, tsk_error_set_errno(TSK_ERR_IMG_SEEK); tsk_error_set_errstr("raw_read: file \"%" PRIttocTSK "\" offset %" PRIuOFF " seek - %d", - raw_info->images[idx], rel_offset, + raw_info->img_info.images[idx], rel_offset, lastError); return -1; } @@ -145,7 +145,7 @@ raw_read_segment(IMG_RAW_INFO * raw_info, int idx, char *buf, tsk_error_set_errno(TSK_ERR_IMG_READ); tsk_error_set_errstr("raw_read: file \"%" PRIttocTSK "\" offset: %" PRIuOFF " read len: %" PRIuSIZE " - %d", - raw_info->images[idx], rel_offset, len, + raw_info->img_info.images[idx], rel_offset, len, lastError); return -1; } @@ -215,7 +215,7 @@ raw_read(TSK_IMG_INFO * img_info, TSK_OFF_T offset, char *buf, size_t len) } // Find the location of the offset - for (i = 0; i < raw_info->num_img; i++) { + for (i = 0; i < raw_info->img_info.num_img; i++) { /* Does the data start in this image? */ if (offset < raw_info->max_off[i]) { @@ -322,15 +322,15 @@ raw_imgstat(TSK_IMG_INFO * img_info, FILE * hFile) tsk_fprintf(hFile, "Image Type: raw\n"); tsk_fprintf(hFile, "\nSize in bytes: %" PRIuOFF "\n", img_info->size); - if (raw_info->num_img > 1) { + if (raw_info->img_info.num_img > 1) { tsk_fprintf(hFile, "\n--------------------------------------------\n"); tsk_fprintf(hFile, "Split Information:\n"); - for (i = 0; i < raw_info->num_img; i++) { + for (i = 0; i < raw_info->img_info.num_img; i++) { tsk_fprintf(hFile, "%" PRIttocTSK " (%" PRIuOFF " to %" PRIuOFF ")\n", - raw_info->images[i], + raw_info->img_info.images[i], (TSK_OFF_T) (i == 0) ? 0 : raw_info->max_off[i - 1], (TSK_OFF_T) (raw_info->max_off[i] - 1)); } @@ -359,14 +359,14 @@ raw_close(TSK_IMG_INFO * img_info) close(raw_info->cache[i].fd); #endif } - for (i = 0; i < raw_info->num_img; i++) { - if (raw_info->images[i]) - free(raw_info->images[i]); + for (i = 0; i < raw_info->img_info.num_img; i++) { + if (raw_info->img_info.images[i]) + free(raw_info->img_info.images[i]); } if (raw_info->max_off) free(raw_info->max_off); - if (raw_info->images) - free(raw_info->images); + if (raw_info->img_info.images) + free(raw_info->img_info.images); if (raw_info->cptr) free(raw_info->cptr); @@ -597,9 +597,9 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], /* see if there are more of them... */ if ((a_num_img == 1) && (raw_info->is_winobj == 0)) { - if ((raw_info->images = + if ((raw_info->img_info.images = tsk_img_findFiles(a_images[0], - &raw_info->num_img)) == NULL) { + &raw_info->img_info.num_img)) == NULL) { tsk_error_reset(); tsk_error_set_errno(TSK_ERR_IMG_STAT); tsk_error_set_errstr @@ -610,54 +610,54 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], } } else { - raw_info->num_img = a_num_img; - raw_info->images = + raw_info->img_info.num_img = a_num_img; + raw_info->img_info.images = (TSK_TCHAR **) tsk_malloc(sizeof(TSK_TCHAR *) * a_num_img); - if (raw_info->images == NULL) { + if (raw_info->img_info.images == NULL) { tsk_img_free(raw_info); return NULL; } - for (i = 0; i < raw_info->num_img; i++) { + for (i = 0; i < raw_info->img_info.num_img; i++) { size_t len = TSTRLEN(a_images[i]); - raw_info->images[i] = + raw_info->img_info.images[i] = (TSK_TCHAR *) tsk_malloc(sizeof(TSK_TCHAR) * (len + 1)); - if (raw_info->images[i] == NULL) { + if (raw_info->img_info.images[i] == NULL) { int j; for (j = 0; j < i; j++) { - free(raw_info->images[j]); + free(raw_info->img_info.images[j]); } - free(raw_info->images); + free(raw_info->img_info.images); tsk_img_free(raw_info); return NULL; } - TSTRNCPY(raw_info->images[i], a_images[i], len + 1); + TSTRNCPY(raw_info->img_info.images[i], a_images[i], len + 1); } } /* sanity check: when we have multiple segments, the size of * each must be known */ - if ((raw_info->num_img > 1) && (first_seg_size < 0)) { + if ((raw_info->img_info.num_img > 1) && (first_seg_size < 0)) { if (tsk_verbose) { tsk_fprintf(stderr, "raw_open: file size is unknown in a segmented raw image\n"); } - for (i = 0; i < raw_info->num_img; i++) { - free(raw_info->images[i]); + for (i = 0; i < raw_info->img_info.num_img; i++) { + free(raw_info->img_info.images[i]); } - free(raw_info->images); + free(raw_info->img_info.images); tsk_img_free(raw_info); return NULL; } /* initialize the split cache */ - raw_info->cptr = (int *) tsk_malloc(raw_info->num_img * sizeof(int)); + raw_info->cptr = (int *) tsk_malloc(raw_info->img_info.num_img * sizeof(int)); if (raw_info->cptr == NULL) { - for (i = 0; i < raw_info->num_img; i++) { - free(raw_info->images[i]); + for (i = 0; i < raw_info->img_info.num_img; i++) { + free(raw_info->img_info.images[i]); } - free(raw_info->images); + free(raw_info->img_info.images); tsk_img_free(raw_info); return NULL; } @@ -668,13 +668,13 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], /* initialize the offset table and re-use the first segment * size gathered above */ raw_info->max_off = - (TSK_OFF_T *) tsk_malloc(raw_info->num_img * sizeof(TSK_OFF_T)); + (TSK_OFF_T *) tsk_malloc(raw_info->img_info.num_img * sizeof(TSK_OFF_T)); if (raw_info->max_off == NULL) { free(raw_info->cptr); - for (i = 0; i < raw_info->num_img; i++) { - free(raw_info->images[i]); + for (i = 0; i < raw_info->img_info.num_img; i++) { + free(raw_info->img_info.images[i]); } - free(raw_info->images); + free(raw_info->img_info.images); tsk_img_free(raw_info); return NULL; } @@ -685,16 +685,16 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], tsk_fprintf(stderr, "raw_open: segment: 0 size: %" PRIuOFF " max offset: %" PRIuOFF " path: %" PRIttocTSK "\n", first_seg_size, - raw_info->max_off[0], raw_info->images[0]); + raw_info->max_off[0], raw_info->img_info.images[0]); } /* get size info for each file - we do not open each one because that * could cause us to run out of file decsriptors when we only need a few. * The descriptors are opened as needed */ - for (i = 1; i < raw_info->num_img; i++) { + for (i = 1; i < raw_info->img_info.num_img; i++) { TSK_OFF_T size; raw_info->cptr[i] = -1; - size = get_size(raw_info->images[i], raw_info->is_winobj); + size = get_size(raw_info->img_info.images[i], raw_info->is_winobj); if (size < 0) { if (size == -1) { if (tsk_verbose) { @@ -703,10 +703,10 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], } } free(raw_info->cptr); - for (i = 0; i < raw_info->num_img; i++) { - free(raw_info->images[i]); + for (i = 0; i < raw_info->img_info.num_img; i++) { + free(raw_info->img_info.images[i]); } - free(raw_info->images); + free(raw_info->img_info.images); tsk_img_free(raw_info); return NULL; } @@ -719,7 +719,7 @@ raw_open(int a_num_img, const TSK_TCHAR * const a_images[], tsk_fprintf(stderr, "raw_open: segment: %d size: %" PRIuOFF " max offset: %" PRIuOFF " path: %" PRIttocTSK "\n", i, size, - raw_info->max_off[i], raw_info->images[i]); + raw_info->max_off[i], raw_info->img_info.images[i]); } } diff --git a/tsk/img/raw.h b/tsk/img/raw.h index ad32180bcc9a6ef1c82f4f74b52954a8f6029701..f64ae70babda5cb346873d22ac01a720eb13dae4 100644 --- a/tsk/img/raw.h +++ b/tsk/img/raw.h @@ -35,11 +35,9 @@ extern "C" { typedef struct { TSK_IMG_INFO img_info; - int num_img; uint8_t is_winobj; // the following are protected by cache_lock in IMG_INFO - TSK_TCHAR **images; TSK_OFF_T *max_off; int *cptr; /* exists for each image - points to entry in cache */ IMG_SPLIT_CACHE cache[SPLIT_CACHE]; /* small number of fds for open images */ diff --git a/tsk/img/tsk_img.h b/tsk/img/tsk_img.h index 19c094539900837d7d16821d288d3b16b6a79593..4415dcf680a7ad6383440307c6b1712f5381b637 100644 --- a/tsk/img/tsk_img.h +++ b/tsk/img/tsk_img.h @@ -85,10 +85,14 @@ extern "C" { uint32_t tag; ///< Set to TSK_IMG_INFO_TAG when struct is alloc TSK_IMG_TYPE_ENUM itype; ///< Type of disk image format TSK_OFF_T size; ///< Total size of image in bytes + int num_img; ///< Number of image files unsigned int sector_size; ///< sector size of device in bytes (typically 512) unsigned int page_size; ///< page size of NAND page in bytes (defaults to 2048) unsigned int spare_size; ///< spare or OOB size of NAND in bytes (defaults to 64) + // the following are protected by cache_lock in IMG_INFO + TSK_TCHAR **images; ///< Image names + tsk_lock_t cache_lock; ///< Lock for cache and associated values char cache[TSK_IMG_INFO_CACHE_NUM][TSK_IMG_INFO_CACHE_LEN]; ///< read cache (r/w shared - lock) TSK_OFF_T cache_off[TSK_IMG_INFO_CACHE_NUM]; ///< starting byte offset of corresponding cache entry (r/w shared - lock) diff --git a/tsk/img/tsk_img_i.h b/tsk/img/tsk_img_i.h index 6cd1a99a8e20b9b57fd1478e39a75dfa2aa7535c..ee8586bd5030e9a8882923d3a2bc94962ae7b848 100644 --- a/tsk/img/tsk_img_i.h +++ b/tsk/img/tsk_img_i.h @@ -40,9 +40,6 @@ extern void tsk_img_free(void *); extern TSK_TCHAR **tsk_img_findFiles(const TSK_TCHAR * a_startingName, int *a_numFound); -extern const TSK_TCHAR ** - tsk_img_get_names(TSK_IMG_INFO *a_img_info, int *a_num_imgs); - #ifdef __cplusplus } #endif diff --git a/tsk/img/vhd.c b/tsk/img/vhd.c index d36d713a7f3a4ff84ad9ffcefc6dded3e9d2606d..ba45fedc1e3b2a32cb189e586c9a18614b29a400 100644 --- a/tsk/img/vhd.c +++ b/tsk/img/vhd.c @@ -132,10 +132,10 @@ static void tsk_error_set_errstr("vhdi_image_close: unable to free handle - %s", errmsg); } - for (i = 0; i < vhdi_info->num_imgs; i++) { - free(vhdi_info->images[i]); + for (i = 0; i < vhdi_info->img_info.num_img; i++) { + free(vhdi_info->img_info.images[i]); } - free(vhdi_info->images); + free(vhdi_info->img_info.images); tsk_deinit_lock(&(vhdi_info->read_lock)); tsk_img_free(img_info); @@ -166,21 +166,21 @@ vhdi_open(int a_num_img, vhdi_info->handle = NULL; img_info = (TSK_IMG_INFO *) vhdi_info; - vhdi_info->num_imgs = a_num_img; - if ((vhdi_info->images = + vhdi_info->img_info.num_img = a_num_img; + if ((vhdi_info->img_info.images = (TSK_TCHAR **) tsk_malloc(a_num_img * sizeof(TSK_TCHAR *))) == NULL) { tsk_img_free(vhdi_info); return NULL; } for (i = 0; i < a_num_img; i++) { - if ((vhdi_info->images[i] = + if ((vhdi_info->img_info.images[i] = (TSK_TCHAR *) tsk_malloc((TSTRLEN(a_images[i]) + 1) * sizeof(TSK_TCHAR))) == NULL) { tsk_img_free(vhdi_info); return NULL; } - TSTRNCPY(vhdi_info->images[i], a_images[i], + TSTRNCPY(vhdi_info->img_info.images[i], a_images[i], TSTRLEN(a_images[i]) + 1); } @@ -202,7 +202,7 @@ vhdi_open(int a_num_img, } // Check the file signature before we call the library open #if defined( TSK_WIN32 ) - if( libvhdi_check_file_signature_wide((const wchar_t *) vhdi_info->images[0], &vhdi_error ) != 1 ) + if( libvhdi_check_file_signature_wide((const wchar_t *) vhdi_info->img_info.images[0], &vhdi_error ) != 1 ) #else if( libvhdi_check_file_signature((const char *) vhdi_info->images[0], &vhdi_error) != 1) #endif @@ -225,7 +225,7 @@ vhdi_open(int a_num_img, } #if defined( TSK_WIN32 ) if (libvhdi_file_open_wide(vhdi_info->handle, - (const wchar_t *) vhdi_info->images[0], + (const wchar_t *) vhdi_info->img_info.images[0], LIBVHDI_OPEN_READ, &vhdi_error) != 1) #else if (libvhdi_file_open(vhdi_info->handle, diff --git a/tsk/img/vhd.h b/tsk/img/vhd.h index 3b37ab7dc9da2496e45a582ebfdf0d6a4a256a18..1e33dd7e6c31e53e92851359e140f1afd56c2023 100644 --- a/tsk/img/vhd.h +++ b/tsk/img/vhd.h @@ -32,8 +32,6 @@ extern "C" { typedef struct { TSK_IMG_INFO img_info; libvhdi_file_t *handle; - TSK_TCHAR **images; - int num_imgs; tsk_lock_t read_lock; // Lock for reads since according to documentation libvhdi is not fully thread safe yet } IMG_VHDI_INFO; diff --git a/tsk/img/vmdk.c b/tsk/img/vmdk.c index cd21701fe1a7fd38778782bc8a9ced752c8991c8..99fbab7435b11ffe1f33b753d86128d48d1bfb8a 100644 --- a/tsk/img/vmdk.c +++ b/tsk/img/vmdk.c @@ -132,10 +132,10 @@ static void tsk_error_set_errstr("vmdk_image_close: unable to free handle - %s", errmsg); } - for (i = 0; i < vmdk_info->num_imgs; i++) { - free(vmdk_info->images[i]); + for (i = 0; i < vmdk_info->img_info.num_img; i++) { + free(vmdk_info->img_info.images[i]); } - free(vmdk_info->images); + free(vmdk_info->img_info.images); tsk_deinit_lock(&(vmdk_info->read_lock)); tsk_img_free(img_info); @@ -166,21 +166,21 @@ vmdk_open(int a_num_img, vmdk_info->handle = NULL; img_info = (TSK_IMG_INFO *) vmdk_info; - vmdk_info->num_imgs = a_num_img; - if ((vmdk_info->images = + vmdk_info->img_info.num_img = a_num_img; + if ((vmdk_info->img_info.images = (TSK_TCHAR **) tsk_malloc(a_num_img * sizeof(TSK_TCHAR *))) == NULL) { tsk_img_free(vmdk_info); return NULL; } for (i = 0; i < a_num_img; i++) { - if ((vmdk_info->images[i] = + if ((vmdk_info->img_info.images[i] = (TSK_TCHAR *) tsk_malloc((TSTRLEN(a_images[i]) + 1) * sizeof(TSK_TCHAR))) == NULL) { tsk_img_free(vmdk_info); return NULL; } - TSTRNCPY(vmdk_info->images[i], a_images[i], + TSTRNCPY(vmdk_info->img_info.images[i], a_images[i], TSTRLEN(a_images[i]) + 1); } @@ -202,7 +202,7 @@ vmdk_open(int a_num_img, } #if defined( TSK_WIN32 ) if (libvmdk_handle_open_wide(vmdk_info->handle, - (const wchar_t *) vmdk_info->images[0], + (const wchar_t *) vmdk_info->img_info.images[0], LIBVMDK_OPEN_READ, &vmdk_error) != 1) #else if (libvmdk_handle_open(vmdk_info->handle, diff --git a/tsk/img/vmdk.h b/tsk/img/vmdk.h index 08f49d26f595d5089fac7937e0b5547f24999d25..0b3ba286da889bdee65a73be3a1f893e709d854f 100644 --- a/tsk/img/vmdk.h +++ b/tsk/img/vmdk.h @@ -32,8 +32,6 @@ extern "C" { typedef struct { TSK_IMG_INFO img_info; libvmdk_handle_t *handle; - TSK_TCHAR **images; - int num_imgs; tsk_lock_t read_lock; // Lock for reads since according to documentation libvmdk is not fully thread safe yet } IMG_VMDK_INFO;