]> granicus.if.org Git - esp-idf/commitdiff
nvs: fix memory leak when writing a blob
authorIvan Grokhotkov <ivan@espressif.com>
Thu, 9 Aug 2018 07:35:19 +0000 (10:35 +0300)
committerIvan Grokhotkov <ivan@espressif.com>
Thu, 9 Aug 2018 07:35:19 +0000 (10:35 +0300)
Introduced in 5a27a63.
Clear usedPages list in all exit conditions, add test.

components/nvs_flash/src/nvs_storage.cpp
components/nvs_flash/test/test_nvs.c

index 611973ce00cf55356bc97df0432632e382116e7b..461309771769aeb0d91e380c3ecbec6b5ef869f5 100644 (file)
@@ -236,10 +236,9 @@ esp_err_t Storage::writeMultiPageBlob(uint8_t nsIndex, const char* key, const vo
         for (auto it = std::begin(usedPages); it != std::end(usedPages); it++) {
             it->mPage->eraseItem(nsIndex, ItemType::BLOB_DATA, key, ii++);
         }
-        usedPages.clearAndFreeNodes();
-        return err;
     }
-    return ESP_OK;
+    usedPages.clearAndFreeNodes();
+    return err;
 }
 
 esp_err_t Storage::writeItem(uint8_t nsIndex, ItemType datatype, const char* key, const void* data, size_t dataSize)
index 8f4ba97c0e26c25081e32f418604ba8c32e51585..0fc9b9501f452075b0d6a535d8810868e321e777 100644 (file)
@@ -9,6 +9,7 @@
 #include "esp_partition.h"
 #include "esp_log.h"
 #include <string.h>
+#include "esp_system.h"
 
 static const char* TAG = "test_nvs";
 
@@ -213,3 +214,28 @@ TEST_CASE("calculate used and free space", "[nvs]")
     TEST_ESP_OK(nvs_flash_erase());
     TEST_ESP_OK(nvs_flash_deinit());
 }
+
+TEST_CASE("check for memory leaks in nvs_set_blob", "[nvs]")
+{
+    esp_err_t err = nvs_flash_init();
+    if (err == ESP_ERR_NVS_NO_FREE_PAGES || err == ESP_ERR_NVS_NEW_VERSION_FOUND) {
+        ESP_ERROR_CHECK(nvs_flash_erase());
+        err = nvs_flash_init();
+    }
+    TEST_ESP_OK( err );
+
+    for (int i = 0; i < 500; ++i) {
+        nvs_handle my_handle;
+        uint8_t key[20] = {0};
+
+        TEST_ESP_OK( nvs_open("test_namespace1", NVS_READWRITE, &my_handle) );
+        TEST_ESP_OK( nvs_set_blob(my_handle, "key", key, sizeof(key)) );
+        TEST_ESP_OK( nvs_commit(my_handle) );
+        nvs_close(my_handle);
+        printf("%d\n", esp_get_free_heap_size());
+    }
+
+    nvs_flash_deinit();
+    printf("%d\n", esp_get_free_heap_size());
+    /* heap leaks will be checked in unity_platform.c */
+}