diff --git a/tsk3/fs/fatfs.c b/tsk3/fs/fatfs.c index d3df72b610bc18292e5fc572ef0f8e4934030c87..1c7699c0dc1ffd0b38d2f1758e6e7caea4a2a8e4 100644 --- a/tsk3/fs/fatfs.c +++ b/tsk3/fs/fatfs.c @@ -708,15 +708,15 @@ fatfs_fsstat(TSK_FS_INFO * fs, FILE * hFile) // clean up any error messages that are lying around tsk_error_reset(); - if ((data_buf = (char *) tsk_malloc(fatfs->ssize)) == NULL) { + if ((data_buf = (char *) tsk_malloc(fs->block_size)) == NULL) { return 1; } /* Read the root directory sector so that we can get the volume * label from it */ - cnt = tsk_fs_read_block(fs, fatfs->rootsect, data_buf, fatfs->ssize); - if (cnt != fatfs->ssize) { + cnt = tsk_fs_read_block(fs, fatfs->rootsect, data_buf, fs->block_size); + if (cnt != fs->block_size) { if (cnt >= 0) { tsk_error_reset(); tsk_errno = TSK_ERR_FS_READ; diff --git a/tsk3/img/img_open.c b/tsk3/img/img_open.c index d4d78dca93e978e5b73e84dce779664bc50e3540..f3aca554116975ae06fa39e49963394b3f5adada 100644 --- a/tsk3/img/img_open.c +++ b/tsk3/img/img_open.c @@ -84,7 +84,13 @@ tsk_img_open(int num_img, tsk_error_reset(); tsk_errno = TSK_ERR_IMG_NOFILE; snprintf(tsk_errstr, TSK_ERRSTR_L, "tsk_img_open"); - tsk_errstr2[0] = '\0'; + return NULL; + } + + if ((a_ssize > 0) & (a_ssize < 512)) { + tsk_error_reset(); + tsk_errno = TSK_ERR_IMG_ARG; + snprintf(tsk_errstr, TSK_ERRSTR_L, "sector size is less than 512 bytes (%d)", a_ssize); return NULL; } diff --git a/tsk3/vs/bsd.c b/tsk3/vs/bsd.c index ef8c93ef95eaf1c28feb4fde326ecc92e2348754..53392073140b81f2d3678ec6671b6c4f223fc685 100644 --- a/tsk3/vs/bsd.c +++ b/tsk3/vs/bsd.c @@ -89,8 +89,8 @@ bsd_get_desc(uint8_t fstype) static uint8_t bsd_load_table(TSK_VS_INFO * a_vs) { - - bsd_disklabel dlabel; + char *sect_buf; + bsd_disklabel *dlabel; uint32_t idx = 0; ssize_t cnt; char *table_str; @@ -101,65 +101,75 @@ bsd_load_table(TSK_VS_INFO * a_vs) tsk_fprintf(stderr, "bsd_load_table: Table Sector: %" PRIuDADDR "\n", laddr); + if ((sect_buf = tsk_malloc(a_vs->block_size)) == NULL) + return 1; + dlabel = (bsd_disklabel *)sect_buf; + /* read the block */ cnt = tsk_vs_read_block - (a_vs, BSD_PART_SOFFSET, (char *) &dlabel, sizeof(dlabel)); - if (cnt != sizeof(dlabel)) { + (a_vs, BSD_PART_SOFFSET, sect_buf, a_vs->block_size); + if (cnt != a_vs->block_size) { if (cnt >= 0) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_READ; } snprintf(tsk_errstr2, TSK_ERRSTR_L, "BSD Disk Label in Sector: %" PRIuDADDR, laddr); + free(sect_buf); return 1; } /* Check the magic */ - if (tsk_vs_guessu32(a_vs, dlabel.magic, BSD_MAGIC)) { + if (tsk_vs_guessu32(a_vs, dlabel->magic, BSD_MAGIC)) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_MAGIC; snprintf(tsk_errstr, TSK_ERRSTR_L, "BSD partition table (magic #1) (Sector: %" PRIuDADDR ") %" PRIx32, laddr, tsk_getu32(a_vs->endian, - dlabel.magic)); + dlabel->magic)); + free(sect_buf); return 1; } /* Check the second magic value */ - if (tsk_getu32(a_vs->endian, dlabel.magic2) != BSD_MAGIC) { + if (tsk_getu32(a_vs->endian, dlabel->magic2) != BSD_MAGIC) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_MAGIC; snprintf(tsk_errstr, TSK_ERRSTR_L, "BSD disk label (magic #2) (Sector: %" PRIuDADDR ") %" PRIx32, laddr, tsk_getu32(a_vs->endian, - dlabel.magic2)); + dlabel->magic2)); + free(sect_buf); return 1; } /* Add an entry of 1 length for the table to the internal structure */ - if ((table_str = tsk_malloc(32)) == NULL) + if ((table_str = tsk_malloc(32)) == NULL) { + free(sect_buf); return 1; + } snprintf(table_str, 32, "Partition Table"); if (NULL == tsk_vs_part_add(a_vs, BSD_PART_SOFFSET, (TSK_DADDR_T) 1, TSK_VS_PART_FLAG_META, table_str, -1, -1)) { + free(sect_buf); return 1; } /* Cycle through the partitions, there are either 8 or 16 */ - for (idx = 0; idx < tsk_getu16(a_vs->endian, dlabel.num_parts); idx++) { + for (idx = 0; idx < tsk_getu16(a_vs->endian, dlabel->num_parts); idx++) { uint32_t part_start; uint32_t part_size; - part_start = tsk_getu32(a_vs->endian, dlabel.part[idx].start_sec); - part_size = tsk_getu32(a_vs->endian, dlabel.part[idx].size_sec); + part_start = tsk_getu32(a_vs->endian, dlabel->part[idx].start_sec); + part_size = tsk_getu32(a_vs->endian, dlabel->part[idx].size_sec); if (tsk_verbose) tsk_fprintf(stderr, "load_table: %" PRIu32 " Starting Sector: %" PRIu32 " Size: %" PRIu32 " Type: %d\n", idx, part_start, - part_size, dlabel.part[idx].fstype); + part_size, dlabel->part[idx].fstype); if (part_size == 0) continue; @@ -169,6 +179,7 @@ bsd_load_table(TSK_VS_INFO * a_vs) tsk_errno = TSK_ERR_VS_BLK_NUM; snprintf(tsk_errstr, TSK_ERRSTR_L, "bsd_load_table: Starting sector too large for image"); + free(sect_buf); return 1; } @@ -176,11 +187,13 @@ bsd_load_table(TSK_VS_INFO * a_vs) /* Add the partition to the internal sorted list */ if (NULL == tsk_vs_part_add(a_vs, (TSK_DADDR_T) part_start, (TSK_DADDR_T) part_size, TSK_VS_PART_FLAG_ALLOC, - bsd_get_desc(dlabel.part[idx].fstype), -1, idx)) { + bsd_get_desc(dlabel->part[idx].fstype), -1, idx)) { + free(sect_buf); return 1; } } + free(sect_buf); return 0; } diff --git a/tsk3/vs/dos.c b/tsk3/vs/dos.c index b8253f287920075e343533912ebabbc487644354..47b74014d1a4dd206a0a83490c6a3e22834aaf62 100644 --- a/tsk3/vs/dos.c +++ b/tsk3/vs/dos.c @@ -672,7 +672,8 @@ static uint8_t dos_load_ext_table(TSK_VS_INFO * vs, TSK_DADDR_T sect_cur, TSK_DADDR_T sect_ext_base, int table) { - dos_sect sect; + dos_sect *sect; + char *sect_buf; int i; char *table_str; ssize_t cnt; @@ -684,37 +685,45 @@ dos_load_ext_table(TSK_VS_INFO * vs, TSK_DADDR_T sect_cur, ", Primary Base Sector: %" PRIuDADDR "\n", sect_cur, sect_ext_base); + if ((sect_buf = tsk_malloc(vs->block_size)) == NULL) + return 1; + sect = (dos_sect *)sect_buf; + /* Read the partition table sector */ - cnt = tsk_vs_read_block(vs, sect_cur, (char *) §, sizeof(sect)); - if (cnt != sizeof(sect)) { + cnt = tsk_vs_read_block(vs, sect_cur, sect_buf, vs->block_size); + if (cnt != vs->block_size) { if (cnt >= 0) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_READ; } snprintf(tsk_errstr2, TSK_ERRSTR_L, "Extended DOS table sector %" PRIuDADDR, sect_cur); + free(sect_buf); return 1; } /* Sanity Check */ - if (tsk_getu16(vs->endian, sect.magic) != DOS_MAGIC) { + if (tsk_getu16(vs->endian, sect->magic) != DOS_MAGIC) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_MAGIC; snprintf(tsk_errstr, TSK_ERRSTR_L, "Extended DOS partition table in sector %" PRIuDADDR, sect_cur); - tsk_errstr2[0] = '\0'; + free(sect_buf); return 1; } /* Add an entry of 1 length for the table to the internal structure */ - if ((table_str = tsk_malloc(32)) == NULL) + if ((table_str = tsk_malloc(32)) == NULL) { + free(sect_buf); return 1; + } snprintf(table_str, 32, "Extended Table (#%d)", table); if (NULL == tsk_vs_part_add(vs, (TSK_DADDR_T) sect_cur, (TSK_DADDR_T) 1, TSK_VS_PART_FLAG_META, table_str, table, -1)) { + free(sect_buf); return 1; } @@ -724,7 +733,7 @@ dos_load_ext_table(TSK_VS_INFO * vs, TSK_DADDR_T sect_cur, * inside of the loop */ for (i = 0; i < 4; i++) { - dos_part *part = §.ptable[i]; + dos_part *part = §->ptable[i]; /* Get the starting sector and size, we currently * ignore CHS */ @@ -758,20 +767,25 @@ dos_load_ext_table(TSK_VS_INFO * vs, TSK_DADDR_T sect_cur, "Starting sector %" PRIuDADDR " too large for image\n", sect_ext_base + part_start); + free(sect_buf); return 1; } if (NULL == tsk_vs_part_add(vs, (TSK_DADDR_T) (sect_ext_base + part_start), (TSK_DADDR_T) part_size, TSK_VS_PART_FLAG_META, - dos_get_desc(part->ptype), table, i)) + dos_get_desc(part->ptype), table, i)) { + free(sect_buf); return 1; + } /* Process the extended partition */ if (dos_load_ext_table(vs, sect_ext_base + part_start, - sect_ext_base, table + 1)) + sect_ext_base, table + 1)) { + free(sect_buf); return 1; + } } else { @@ -788,16 +802,20 @@ dos_load_ext_table(TSK_VS_INFO * vs, TSK_DADDR_T sect_cur, tsk_fprintf(stderr, "Starting sector %" PRIuDADDR " too large for image\n", sect_cur + part_start); + free(sect_buf); return 1; } if (NULL == tsk_vs_part_add(vs, (TSK_DADDR_T) (sect_cur + part_start), (TSK_DADDR_T) part_size, TSK_VS_PART_FLAG_ALLOC, - dos_get_desc(part->ptype), table, i)) + dos_get_desc(part->ptype), table, i)) { + free(sect_buf); return 1; + } } } - + + free(sect_buf); return 0; } @@ -816,7 +834,8 @@ dos_load_ext_table(TSK_VS_INFO * vs, TSK_DADDR_T sect_cur, static uint8_t dos_load_prim_table(TSK_VS_INFO * vs, uint8_t test) { - dos_sect sect; + dos_sect *sect; + char *sect_buf; int i, added = 0; char *table_str; ssize_t cnt; @@ -827,28 +846,34 @@ dos_load_prim_table(TSK_VS_INFO * vs, uint8_t test) tsk_fprintf(stderr, "dos_load_prim: Table Sector: %" PRIuDADDR "\n", taddr); + if ((sect_buf = tsk_malloc(vs->block_size)) == NULL) + return 1; + sect = (dos_sect *)sect_buf; + /* Read the table */ cnt = tsk_vs_read_block - (vs, DOS_PART_SOFFSET, (char *) §, sizeof(sect)); + (vs, DOS_PART_SOFFSET, sect_buf, vs->block_size); - if (cnt != sizeof(sect)) { + if (cnt != vs->block_size) { if (cnt >= 0) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_READ; } snprintf(tsk_errstr2, TSK_ERRSTR_L, "Primary DOS table sector %" PRIuDADDR, taddr); + free(sect_buf); return 1; } /* Sanity Check */ - if (tsk_vs_guessu16(vs, sect.magic, DOS_MAGIC)) { + if (tsk_vs_guessu16(vs, sect->magic, DOS_MAGIC)) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_MAGIC; snprintf(tsk_errstr, TSK_ERRSTR_L, "File is not a DOS partition (invalid primary magic) (Sector: %" PRIuDADDR ")", taddr); + free(sect_buf); return 1; } @@ -862,7 +887,7 @@ dos_load_prim_table(TSK_VS_INFO * vs, uint8_t test) tsk_fprintf(stderr, "dos_load_prim_table: Testing FAT/NTFS conditions\n"); - if (strncmp("MSDOS", sect.oemname, 5) == 0) { + if (strncmp("MSDOS", sect->oemname, 5) == 0) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_MAGIC; snprintf(tsk_errstr, TSK_ERRSTR_L, @@ -870,9 +895,10 @@ dos_load_prim_table(TSK_VS_INFO * vs, uint8_t test) if (tsk_verbose) tsk_fprintf(stderr, "dos_load_prim_table: MSDOS OEM name exists\n"); + free(sect_buf); return 1; } - else if (strncmp("MSWIN", sect.oemname, 5) == 0) { + else if (strncmp("MSWIN", sect->oemname, 5) == 0) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_MAGIC; snprintf(tsk_errstr, TSK_ERRSTR_L, @@ -880,9 +906,10 @@ dos_load_prim_table(TSK_VS_INFO * vs, uint8_t test) if (tsk_verbose) tsk_fprintf(stderr, "dos_load_prim_table: MSWIN OEM name exists\n"); + free(sect_buf); return 1; } - else if (strncmp("NTFS", sect.oemname, 4) == 0) { + else if (strncmp("NTFS", sect->oemname, 4) == 0) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_MAGIC; snprintf(tsk_errstr, TSK_ERRSTR_L, @@ -890,9 +917,10 @@ dos_load_prim_table(TSK_VS_INFO * vs, uint8_t test) if (tsk_verbose) tsk_fprintf(stderr, "dos_load_prim_table: NTFS OEM name exists\n"); + free(sect_buf); return 1; } - else if (strncmp("FAT", sect.oemname, 4) == 0) { + else if (strncmp("FAT", sect->oemname, 4) == 0) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_MAGIC; snprintf(tsk_errstr, TSK_ERRSTR_L, @@ -900,22 +928,27 @@ dos_load_prim_table(TSK_VS_INFO * vs, uint8_t test) if (tsk_verbose) tsk_fprintf(stderr, "dos_load_prim_table: FAT OEM name exists\n"); + free(sect_buf); return 1; } } /* Add an entry of 1 sector for the table to the internal structure */ - if ((table_str = tsk_malloc(32)) == NULL) + if ((table_str = tsk_malloc(32)) == NULL) { + free(sect_buf); return 1; + } snprintf(table_str, 32, "Primary Table (#0)"); if (NULL == tsk_vs_part_add(vs, DOS_PART_SOFFSET, (TSK_DADDR_T) 1, - TSK_VS_PART_FLAG_META, table_str, -1, -1)) + TSK_VS_PART_FLAG_META, table_str, -1, -1)) { + free(sect_buf); return 1; + } /* Cycle through the partition table */ for (i = 0; i < 4; i++) { - dos_part *part = §.ptable[i]; + dos_part *part = §->ptable[i]; /* We currently ignore CHS */ uint32_t part_start = tsk_getu32(vs->endian, part->start_sec); @@ -938,7 +971,7 @@ dos_load_prim_table(TSK_VS_INFO * vs, uint8_t test) tsk_fprintf(stderr, "Starting sector %" PRIu32 " too large for image\n", part_start); - + free(sect_buf); return 1; } #if 0 @@ -959,19 +992,27 @@ dos_load_prim_table(TSK_VS_INFO * vs, uint8_t test) if (dos_is_ext(part->ptype)) { if (NULL == tsk_vs_part_add(vs, (TSK_DADDR_T) part_start, (TSK_DADDR_T) part_size, TSK_VS_PART_FLAG_META, - dos_get_desc(part->ptype), 0, i)) + dos_get_desc(part->ptype), 0, i)) { + free(sect_buf); return 1; + } - if (dos_load_ext_table(vs, part_start, part_start, 1)) + if (dos_load_ext_table(vs, part_start, part_start, 1)) { + free(sect_buf); return 1; + } } else { if (NULL == tsk_vs_part_add(vs, (TSK_DADDR_T) part_start, (TSK_DADDR_T) part_size, TSK_VS_PART_FLAG_ALLOC, - dos_get_desc(part->ptype), 0, i)) + dos_get_desc(part->ptype), 0, i)) { + free(sect_buf); return 1; + } } } + free(sect_buf); + if (added == 0) { if (tsk_verbose) tsk_fprintf(stderr, "dos_load_prim: No valid entries\n"); @@ -982,7 +1023,6 @@ dos_load_prim_table(TSK_VS_INFO * vs, uint8_t test) "dos_load_prim_table: No valid entries in primary table"); return 1; } - return 0; } diff --git a/tsk3/vs/gpt.c b/tsk3/vs/gpt.c index 606660bc729d49389c872106cbba455ac88fae2b..7e680ab5a845e75612195cc99953cf1a3e3d0716 100644 --- a/tsk3/vs/gpt.c +++ b/tsk3/vs/gpt.c @@ -24,13 +24,14 @@ static uint8_t gpt_load_table(TSK_VS_INFO * vs) { - gpt_head head; + gpt_head *head; gpt_entry *ent; - dos_sect dos_part; + dos_sect *dos_part; unsigned int i, a; uint32_t ent_size; char *safe_str, *head_str, *tab_str, *ent_buf; ssize_t cnt; + char *sect_buf; TSK_DADDR_T taddr = vs->offset / vs->block_size + GPT_PART_SOFFSET; TSK_DADDR_T max_addr = (vs->img_info->size - vs->offset) / vs->block_size; // max sector @@ -38,10 +39,14 @@ gpt_load_table(TSK_VS_INFO * vs) tsk_fprintf(stderr, "gpt_load_table: Sector: %" PRIuDADDR "\n", taddr); + if ((sect_buf = tsk_malloc(vs->block_size)) == NULL) + return 1; + dos_part = (dos_sect *)sect_buf; + cnt = tsk_vs_read_block - (vs, GPT_PART_SOFFSET, (char *) &dos_part, sizeof(dos_part)); + (vs, GPT_PART_SOFFSET, sect_buf, vs->block_size); /* if -1, then tsk_errno is already set */ - if (cnt != sizeof(dos_part)) { + if (cnt != vs->block_size) { if (cnt >= 0) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_READ; @@ -49,104 +54,125 @@ gpt_load_table(TSK_VS_INFO * vs) snprintf(tsk_errstr2, TSK_ERRSTR_L, "Error reading DOS safety partition table in Sector: %" PRIuDADDR, taddr); + free(sect_buf); return 1; } /* Sanity Check */ - if (tsk_vs_guessu16(vs, dos_part.magic, DOS_MAGIC)) { + if (tsk_vs_guessu16(vs, dos_part->magic, DOS_MAGIC)) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_MAGIC; snprintf(tsk_errstr, TSK_ERRSTR_L, "Missing DOS safety partition (invalid magic) (Sector: %" PRIuDADDR ")", taddr); + free(sect_buf); return 1; } - if (dos_part.ptable[0].ptype != GPT_DOS_TYPE) { + if (dos_part->ptable[0].ptype != GPT_DOS_TYPE) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_MAGIC; snprintf(tsk_errstr, TSK_ERRSTR_L, "Missing DOS safety partition (invalid type in table: %d)", - dos_part.ptable[0].ptype); + dos_part->ptable[0].ptype); + free(sect_buf); return 1; } - if ((safe_str = tsk_malloc(16)) == NULL) + if ((safe_str = tsk_malloc(16)) == NULL) { + free(sect_buf); return 1; + } snprintf(safe_str, 16, "Safety Table"); if (NULL == tsk_vs_part_add(vs, (TSK_DADDR_T) 0, (TSK_DADDR_T) 1, - TSK_VS_PART_FLAG_META, safe_str, -1, -1)) + TSK_VS_PART_FLAG_META, safe_str, -1, -1)) { + free(sect_buf); return 1; + } /* Read the GPT header */ + head = (gpt_head *)sect_buf; cnt = tsk_vs_read_block - (vs, GPT_PART_SOFFSET + 1, (char *) &head, sizeof(head)); - if (cnt != sizeof(head)) { + (vs, GPT_PART_SOFFSET + 1, sect_buf, vs->block_size); + if (cnt != vs->block_size) { if (cnt >= 0) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_READ; } snprintf(tsk_errstr2, TSK_ERRSTR_L, "GPT Header structure in Sector: %" PRIuDADDR, taddr + 1); + free(sect_buf); return 1; } - if (tsk_getu64(vs->endian, &head.signature) != GPT_HEAD_SIG) { + if (tsk_getu64(vs->endian, &head->signature) != GPT_HEAD_SIG) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_MAGIC; snprintf(tsk_errstr, TSK_ERRSTR_L, "GPT Header: %" PRIx64, tsk_getu64(vs->endian, - &head.signature)); + &head->signature)); + free(sect_buf); return 1; } - if ((head_str = tsk_malloc(16)) == NULL) + if ((head_str = tsk_malloc(16)) == NULL) { + free(sect_buf); return 1; + } snprintf(head_str, 16, "GPT Header"); if (NULL == tsk_vs_part_add(vs, (TSK_DADDR_T) 1, (TSK_DADDR_T) ((tsk_getu32(vs->endian, - &head.head_size_b) + 511) / 512), - TSK_VS_PART_FLAG_META, head_str, -1, -1)) + &head->head_size_b) + 511) / 512), + TSK_VS_PART_FLAG_META, head_str, -1, -1)) { + free(sect_buf); return 1; + } /* Allocate a buffer for each table entry */ - ent_size = tsk_getu32(vs->endian, &head.tab_size_b); + ent_size = tsk_getu32(vs->endian, &head->tab_size_b); if (ent_size < sizeof(gpt_entry)) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_MAGIC; snprintf(tsk_errstr, TSK_ERRSTR_L, "Header reports partition entry size of %" PRIu32 " and not %" PRIuSIZE "", ent_size, sizeof(gpt_entry)); + free(sect_buf); return 1; } - if ((tab_str = tsk_malloc(20)) == NULL) + if ((tab_str = tsk_malloc(20)) == NULL) { + free(sect_buf); return 1; + } snprintf(tab_str, 20, "Partition Table"); if (NULL == tsk_vs_part_add(vs, (TSK_DADDR_T) tsk_getu64(vs->endian, - &head.tab_start_lba), + &head->tab_start_lba), (TSK_DADDR_T) ((ent_size * tsk_getu32(vs->endian, - &head.tab_num_ent) + 511) / 512), - TSK_VS_PART_FLAG_META, tab_str, -1, -1)) + &head->tab_num_ent) + 511) / 512), + TSK_VS_PART_FLAG_META, tab_str, -1, -1)) { + free(sect_buf); return 1; + } /* Process the partition table */ - if ((ent_buf = tsk_malloc(vs->block_size)) == NULL) + if ((ent_buf = tsk_malloc(vs->block_size)) == NULL) { + free(sect_buf); return 1; + } i = 0; - for (a = 0; i < tsk_getu32(vs->endian, &head.tab_num_ent); a++) { + for (a = 0; i < tsk_getu32(vs->endian, &head->tab_num_ent); a++) { char *name; /* Read a sector */ cnt = tsk_vs_read_block(vs, - tsk_getu64(vs->endian, &head.tab_start_lba) + a, + tsk_getu64(vs->endian, &head->tab_start_lba) + a, ent_buf, vs->block_size); if (cnt != vs->block_size) { if (cnt >= 0) { @@ -156,14 +182,16 @@ gpt_load_table(TSK_VS_INFO * vs) snprintf(tsk_errstr2, TSK_ERRSTR_L, "Error reading GPT partition table sector : %" PRIuDADDR, tsk_getu64(vs->endian, - &head.tab_start_lba) + a); + &head->tab_start_lba) + a); + free(ent_buf); + free(sect_buf); return 1; } /* Process the sector */ ent = (gpt_entry *) ent_buf; for (; (uintptr_t) ent < (uintptr_t) ent_buf + vs->block_size && - i < tsk_getu32(vs->endian, &head.tab_num_ent); i++) { + i < tsk_getu32(vs->endian, &head->tab_num_ent); i++) { UTF16 *name16; UTF8 *name8; @@ -188,12 +216,17 @@ gpt_load_table(TSK_VS_INFO * vs) tsk_errno = TSK_ERR_VS_BLK_NUM; snprintf(tsk_errstr, TSK_ERRSTR_L, "gpt_load_table: Starting sector too large for image"); + free(sect_buf); + free(ent_buf); return 1; } - if ((name = tsk_malloc(256)) == NULL) + if ((name = tsk_malloc(256)) == NULL) { + free(sect_buf); + free(ent_buf); return 1; + } name16 = (UTF16 *) ((uintptr_t) ent->name); name8 = (UTF8 *) name; @@ -217,13 +250,18 @@ gpt_load_table(TSK_VS_INFO * vs) (TSK_DADDR_T) (tsk_getu64(vs->endian, ent->end_lba) - tsk_getu64(vs->endian, ent->start_lba) + 1), TSK_VS_PART_FLAG_ALLOC, - name, -1, i)) + name, -1, i)) { + free(sect_buf); + free(ent_buf); return 1; + } ent++; } } + free(sect_buf); + free(ent_buf); return 0; } diff --git a/tsk3/vs/sun.c b/tsk3/vs/sun.c index ef32ae70feff46b3ce73231a66a806faeb68585f..98cefa4ba610633007a6f4119305710623ad74e9 100644 --- a/tsk3/vs/sun.c +++ b/tsk3/vs/sun.c @@ -208,43 +208,44 @@ sun_load_table_sparc(TSK_VS_INFO * vs, sun_dlabel_sparc * dlabel_sp) static uint8_t sun_load_table(TSK_VS_INFO * vs) { -/* this will need to change if any of the disk label structures change */ -#define LABEL_BUF_SIZE 512 - sun_dlabel_sparc *dlabel_sp; sun_dlabel_i386 *dlabel_x86; - char buf[LABEL_BUF_SIZE]; + char *buf; ssize_t cnt; TSK_DADDR_T taddr = vs->offset / vs->block_size + SUN_SPARC_PART_SOFFSET; /* Sanity check in case label sizes change */ - if ((sizeof(*dlabel_sp) > LABEL_BUF_SIZE) || - (sizeof(*dlabel_x86) > LABEL_BUF_SIZE)) { + if ((sizeof(*dlabel_sp) > vs->block_size) || + (sizeof(*dlabel_x86) > vs->block_size)) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_BUF; snprintf(tsk_errstr, TSK_ERRSTR_L, - "sun_load_table: Buffer smaller than label sizes"); + "sun_load_table: disk labels bigger than block size"); return 1; } if (tsk_verbose) tsk_fprintf(stderr, "sun_load_table: Trying sector: %" PRIuDADDR "\n", taddr); - + + if ((buf = tsk_malloc(vs->block_size)) == NULL) + return 1; + /* Try the given offset */ cnt = tsk_vs_read_block - (vs, SUN_SPARC_PART_SOFFSET, (char *) &buf, LABEL_BUF_SIZE); + (vs, SUN_SPARC_PART_SOFFSET, buf, vs->block_size); /* If -1 is returned, tsk_errno is already set */ - if (cnt != LABEL_BUF_SIZE) { + if (cnt != vs->block_size) { if (cnt >= 0) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_READ; } snprintf(tsk_errstr2, TSK_ERRSTR_L, "SUN Disk Label in Sector: %" PRIuDADDR, taddr); + free(buf); return 1; } @@ -259,9 +260,11 @@ sun_load_table(TSK_VS_INFO * vs) dlabel_x86 = (sun_dlabel_i386 *) buf; if (tsk_vs_guessu16(vs, dlabel_sp->magic, SUN_MAGIC) == 0) { if (tsk_getu32(vs->endian, dlabel_sp->sanity) == SUN_SANITY) { + free(buf); return sun_load_table_sparc(vs, dlabel_sp); } else if (tsk_getu32(vs->endian, dlabel_x86->sanity) == SUN_SANITY) { + free(buf); return sun_load_table_i386(vs, dlabel_x86); } } @@ -276,15 +279,16 @@ sun_load_table(TSK_VS_INFO * vs) "sun_load_table: Trying sector: %" PRIuDADDR "\n", taddr + 1); cnt = tsk_vs_read_block - (vs, SUN_I386_PART_SOFFSET, (char *) &buf, LABEL_BUF_SIZE); + (vs, SUN_I386_PART_SOFFSET, buf, vs->block_size); - if (cnt != LABEL_BUF_SIZE) { + if (cnt != vs->block_size) { if (cnt >= 0) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_READ; } snprintf(tsk_errstr2, TSK_ERRSTR_L, "SUN (Intel) Disk Label in Sector: %" PRIuDADDR, taddr); + free(buf); return 1; } @@ -296,6 +300,7 @@ sun_load_table(TSK_VS_INFO * vs) "SUN (intel) partition table (Sector: %" PRIuDADDR ") %x", taddr, tsk_getu16(vs->endian, dlabel_sp->magic)); + free(buf); return 1; } @@ -305,9 +310,11 @@ sun_load_table(TSK_VS_INFO * vs) snprintf(tsk_errstr, TSK_ERRSTR_L, "SUN (intel) sanity value (Sector: %" PRIuDADDR ") %x", taddr, tsk_getu16(vs->endian, dlabel_sp->magic)); + free(buf); return 1; } - + + free(buf); return sun_load_table_i386(vs, dlabel_x86); }