packages: nvram: fix memory leak in _nvram_free
[openwrt/openwrt.git] / package / utils / nvram / src / nvram.c
index 0e4294391ad69af92d2682ac144518fa20b6e9a5..d5e12ee69a3e78cc94916c75009444795d8c1baf 100644 (file)
@@ -47,6 +47,8 @@ static void _nvram_free(nvram_handle_t *h)
        for (i = 0; i < NVRAM_ARRAYSIZE(h->nvram_hash); i++) {
                for (t = h->nvram_hash[i]; t; t = next) {
                        next = t->next;
+                       if (t->value)
+                               free(t->value);
                        free(t);
                }
                h->nvram_hash[i] = NULL;
@@ -55,6 +57,8 @@ static void _nvram_free(nvram_handle_t *h)
        /* Free dead table */
        for (t = h->nvram_dead; t; t = next) {
                next = t->next;
+               if (t->value)
+                       free(t->value);
                free(t);
        }
 
@@ -380,7 +384,9 @@ nvram_handle_t * nvram_open(const char *file, int rdonly)
 
                        if( offset < 0 )
                        {
+                               munmap(mmap_area, nvram_part_size);
                                free(mtd);
+                               close(fd);
                                return NULL;
                        }
                        else if( (h = malloc(sizeof(nvram_handle_t))) != NULL )
@@ -410,6 +416,7 @@ nvram_handle_t * nvram_open(const char *file, int rdonly)
        }
 
        free(mtd);
+       close(fd);
        return NULL;
 }