From 819ffc90474ba312576a6a9a357c89e877cf10a7 Mon Sep 17 00:00:00 2001 From: Brian Carrier <carrier@sleuthkit.org> Date: Wed, 28 Oct 2009 18:49:33 +0000 Subject: [PATCH] updated Mac read to be in block-sized chunks --- tsk3/vs/mac.c | 46 ++++++++++++++++++++++++++++++---------------- 1 file changed, 30 insertions(+), 16 deletions(-) diff --git a/tsk3/vs/mac.c b/tsk3/vs/mac.c index 1819b2e8e..a626bb590 100644 --- a/tsk3/vs/mac.c +++ b/tsk3/vs/mac.c @@ -25,7 +25,8 @@ static uint8_t mac_load_table(TSK_VS_INFO * vs) { - mac_part part; + char *part_buf; + mac_part *part; char *table_str; uint32_t idx, max_part; TSK_DADDR_T taddr = vs->offset / vs->block_size + MAC_PART_SOFFSET; @@ -37,8 +38,11 @@ mac_load_table(TSK_VS_INFO * vs) /* The table can be variable length, so we loop on it * The idx variable shows which round it is - * Each structure is 512-bytes each + * Each structure is a block size */ + if ((part_buf = tsk_malloc(vs->block_size)) == NULL) + return 1; + part = (mac_part *)part_buf; max_part = 1; /* set it to 1 and it will be set in the first loop */ for (idx = 0; idx < max_part; idx++) { @@ -50,16 +54,17 @@ mac_load_table(TSK_VS_INFO * vs) /* Read the entry */ cnt = tsk_vs_read_block - (vs, MAC_PART_SOFFSET + idx, (char *) &part, sizeof(part)); + (vs, MAC_PART_SOFFSET + idx, part_buf, vs->block_size); /* If -1, then tsk_errno is already set */ - if (cnt != sizeof(part)) { + if (cnt != vs->block_size) { if (cnt >= 0) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_READ; } snprintf(tsk_errstr2, TSK_ERRSTR_L, "MAC Partition entry %" PRIuDADDR, taddr + idx); + free(part_buf); return 1; } @@ -67,43 +72,45 @@ mac_load_table(TSK_VS_INFO * vs) /* Sanity Check */ if (idx == 0) { /* Set the endian ordering the first time around */ - if (tsk_vs_guessu16(vs, part.magic, MAC_MAGIC)) { + if (tsk_vs_guessu16(vs, part->magic, MAC_MAGIC)) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_MAGIC; snprintf(tsk_errstr, TSK_ERRSTR_L, "Mac partition table entry (Sector: %" PRIuDADDR ") %" PRIx16, - (taddr + idx), tsk_getu16(vs->endian, part.magic)); + (taddr + idx), tsk_getu16(vs->endian, part->magic)); if (tsk_verbose) tsk_fprintf(stderr, "mac_load: Missing initial magic value\n"); + free(part_buf); return 1; } /* Get the number of partitions */ - max_part = tsk_getu32(vs->endian, part.pmap_size); + max_part = tsk_getu32(vs->endian, part->pmap_size); } - else if (tsk_getu16(vs->endian, part.magic) != MAC_MAGIC) { + else if (tsk_getu16(vs->endian, part->magic) != MAC_MAGIC) { tsk_error_reset(); tsk_errno = TSK_ERR_VS_MAGIC; snprintf(tsk_errstr, TSK_ERRSTR_L, "Mac partition table entry (Sector: %" PRIuDADDR ") %" PRIx16, (taddr + idx), - tsk_getu16(vs->endian, part.magic)); + tsk_getu16(vs->endian, part->magic)); if (tsk_verbose) tsk_fprintf(stderr, "mac_load: Missing magic value in entry %"PRIu32"\n", idx); + free(part_buf); return 1; } - part_start = tsk_getu32(vs->endian, part.start_sec); - part_size = tsk_getu32(vs->endian, part.size_sec); + part_start = tsk_getu32(vs->endian, part->start_sec); + part_size = tsk_getu32(vs->endian, part->size_sec); if (tsk_verbose) tsk_fprintf(stderr, "mac_load: %" PRIu32 " Starting Sector: %" PRIu32 " Size: %" PRIu32 " Type: %s\n", idx, part_start, - part_size, part.type); + part_size, part->type); if (part_size == 0) continue; @@ -116,29 +123,36 @@ mac_load_table(TSK_VS_INFO * vs) if (tsk_verbose) tsk_fprintf(stderr, "mac_load: Starting sector too large for image (%"PRIu32" vs %"PRIu32")\n", part_start, max_addr); + free(part_buf); return 1; } - if ((str = tsk_malloc(sizeof(part.name))) == NULL) + if ((str = tsk_malloc(sizeof(part->name))) == NULL) { + free(part_buf); return 1; + } - strncpy(str, (char *) part.type, sizeof(part.name)); + strncpy(str, (char *) part->type, sizeof(part->name)); if (NULL == tsk_vs_part_add(vs, (TSK_DADDR_T) part_start, (TSK_DADDR_T) part_size, TSK_VS_PART_FLAG_ALLOC, str, -1, idx)) return 1; } + free(part_buf); + part_buf = NULL; /* Add an entry for the table length */ - if ((table_str = tsk_malloc(16)) == NULL) + if ((table_str = tsk_malloc(16)) == NULL) { return 1; + } snprintf(table_str, 16, "Table"); if (NULL == tsk_vs_part_add(vs, taddr, max_part, TSK_VS_PART_FLAG_META, - table_str, -1, -1)) + table_str, -1, -1)) { return 1; + } return 0; } -- GitLab