diff --git a/tsk/fs/fatfs_meta.c b/tsk/fs/fatfs_meta.c
index 2a3b28153280c1456b578b55aae8b523635cfbd1..6a21b3fe73f1150a9c211db68b11edca4ffb228e 100755
--- a/tsk/fs/fatfs_meta.c
+++ b/tsk/fs/fatfs_meta.c
@@ -759,6 +759,11 @@ fatfs_make_data_runs(TSK_FS_FILE * a_fs_file)
                 tsk_error_set_errstr
                     ("%s: Invalid sector address in FAT (too large): %"
                     PRIuDADDR " (plus %d sectors)", func_name, sbase, fatfs->csize);
+                tsk_fs_attr_run_free(data_run_head);
+                if (list_seen != NULL) {
+                    tsk_list_free(list_seen);
+                    list_seen = NULL;
+                }
                 return 1;
             }
 
@@ -770,6 +775,10 @@ fatfs_make_data_runs(TSK_FS_FILE * a_fs_file)
                 if (data_run_tmp == NULL) {
                     tsk_fs_attr_run_free(data_run_head);
                     fs_meta->attr_state = TSK_FS_META_ATTR_ERROR;
+                    if (list_seen != NULL) {
+                        tsk_list_free(list_seen);
+                        list_seen = NULL;
+                    }
                     return 1;
                 }
 
@@ -798,8 +807,10 @@ fatfs_make_data_runs(TSK_FS_FILE * a_fs_file)
                         "  cluster: %" PRIuDADDR, func_name, fs_meta->addr, clust);
                     fs_meta->attr_state = TSK_FS_META_ATTR_ERROR;
                     tsk_fs_attr_run_free(data_run_head);
-                    tsk_list_free(list_seen);
-                    list_seen = NULL;
+                    if (list_seen != NULL) {
+                        tsk_list_free(list_seen);
+                        list_seen = NULL;
+                    }
                     return 1;
                 }
                 clust = nxt;
@@ -809,13 +820,21 @@ fatfs_make_data_runs(TSK_FS_FILE * a_fs_file)
                     if (tsk_verbose)
                         tsk_fprintf(stderr,
                             "Loop found while processing file\n");
+                    tsk_fs_attr_run_free(data_run_head);
+                    if (list_seen != NULL) {
+                        tsk_list_free(list_seen);
+                        list_seen = NULL;
+                    }
                     break;
                 }
 
                 if (tsk_list_add(&list_seen, clust)) {
                     fs_meta->attr_state = TSK_FS_META_ATTR_ERROR;
-                    tsk_list_free(list_seen);
-                    list_seen = NULL;
+                    tsk_fs_attr_run_free(data_run_head);
+                    if (list_seen != NULL) {
+                        tsk_list_free(list_seen);
+                        list_seen = NULL;
+                    }
                     return 1;
                 }
             }
@@ -826,6 +845,10 @@ fatfs_make_data_runs(TSK_FS_FILE * a_fs_file)
                 tsk_fs_attrlist_getnew(fs_meta->attr,
                     TSK_FS_ATTR_NONRES)) == NULL) {
             fs_meta->attr_state = TSK_FS_META_ATTR_ERROR;
+            if (list_seen != NULL) {
+                tsk_list_free(list_seen);
+                list_seen = NULL;
+            }
             return 1;
         }
 
@@ -835,6 +858,11 @@ fatfs_make_data_runs(TSK_FS_FILE * a_fs_file)
                 fs_meta->size, fs_meta->size, roundup(fs_meta->size,
                     fatfs->csize * fs->block_size), 0, 0)) {
             fs_meta->attr_state = TSK_FS_META_ATTR_ERROR;
+            tsk_fs_attr_run_free(data_run_head);
+            if (list_seen != NULL) {
+                tsk_list_free(list_seen);
+                list_seen = NULL;
+            }
             return 1;
         }