From 5fc639758921ef2eb281e384ca9658bba0a2661f Mon Sep 17 00:00:00 2001 From: Ivan Grokhotkov Date: Thu, 9 Aug 2018 10:35:19 +0300 Subject: [PATCH] nvs: fix memory leak when writing a blob Introduced in 5a27a63. Clear usedPages list in all exit conditions, add test. --- components/nvs_flash/src/nvs_storage.cpp | 5 ++--- components/nvs_flash/test/test_nvs.c | 26 ++++++++++++++++++++++++ 2 files changed, 28 insertions(+), 3 deletions(-) diff --git a/components/nvs_flash/src/nvs_storage.cpp b/components/nvs_flash/src/nvs_storage.cpp index 611973ce0..461309771 100644 --- a/components/nvs_flash/src/nvs_storage.cpp +++ b/components/nvs_flash/src/nvs_storage.cpp @@ -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) diff --git a/components/nvs_flash/test/test_nvs.c b/components/nvs_flash/test/test_nvs.c index 8f4ba97c0..0fc9b9501 100644 --- a/components/nvs_flash/test/test_nvs.c +++ b/components/nvs_flash/test/test_nvs.c @@ -9,6 +9,7 @@ #include "esp_partition.h" #include "esp_log.h" #include +#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 */ +}