diff --git a/tsk/fs/yaffs.cpp b/tsk/fs/yaffs.cpp
index f7492ed0dbd14d068a238ff70f9872720f4fd0f4..77f3539721cb2c68f8b1fc8d859ee8273b83798b 100644
--- a/tsk/fs/yaffs.cpp
+++ b/tsk/fs/yaffs.cpp
@@ -2639,6 +2639,8 @@ TSK_FS_INFO *
     yaffsfs->page_size = psize == 0 ? YAFFS_DEFAULT_PAGE_SIZE : psize;
     yaffsfs->spare_size = ssize == 0 ? YAFFS_DEFAULT_SPARE_SIZE : ssize;
     yaffsfs->chunks_per_block = 64;
+    // TODO: Why are 2 different memory allocation methods used in the same code?
+    // This make things unnecessary complex.
     yaffsfs->chunkMap = new std::map<uint32_t, YaffsCacheChunkGroup>;
     yaffsfs->max_obj_id = 1;
     yaffsfs->max_version = 0;
@@ -2667,7 +2669,7 @@ TSK_FS_INFO *
         tsk_error_set_errstr("not a YAFFS file system (bad spare format)");
         if (tsk_verbose)
             fprintf(stderr, "yaffsfs_open: could not find valid spare area format\n");
-        return NULL;
+        goto on_error;
     }
 
     /*
@@ -2682,9 +2684,10 @@ TSK_FS_INFO *
         tsk_error_set_errstr("not a YAFFS file system (first record)");
         if (tsk_verbose)
             fprintf(stderr, "yaffsfs_open: invalid first record\n");
-        return NULL;
+        goto on_error;
     }
     free(first_header);
+    first_header = NULL;
 
     fs->duname = "Chunk";
 
@@ -2766,5 +2769,18 @@ TSK_FS_INFO *
     tsk_fs_dir_close(test_dir);
 
     return fs;
+
+on_error:
+    // Make sure to free yaffsfs here otherwise it will leak
+    if( yaffsfs != NULL ) {
+        // TODO: where is chunkMap freed in normal operations?
+        if( yaffsfs->chunkMap != NULL ) {
+            yaffsfs->chunkMap->clear();
+
+            delete yaffsfs->chunkMap;
+        }
+        free( yaffsfs );
+    }
+    return NULL;
 }