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 *) &sect, 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 = &sect.ptable[i];
+        dos_part *part = &sect->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 *) &sect, 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 = &sect.ptable[i];
+        dos_part *part = &sect->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);
 }