From 9b4cdda3412b80cb2702788d951db0dc10cfd795 Mon Sep 17 00:00:00 2001
From: Joachim Metz <joachim.metz@gmail.com>
Date: Thu, 29 Aug 2013 08:09:09 +0200
Subject: [PATCH] Fix for memory leak

---
 tsk/fs/yaffs.cpp | 20 ++++++++++++++++++--
 1 file changed, 18 insertions(+), 2 deletions(-)

diff --git a/tsk/fs/yaffs.cpp b/tsk/fs/yaffs.cpp
index f7492ed0d..77f353972 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;
 }
 
-- 
GitLab