Merge branch 'bugfix/nvs_mem_leak' into 'master'

nvs: fix memory leak when writing a blob

See merge request idf/esp-idf!2969
This commit is contained in:
Ivan Grokhotkov 2018-08-09 20:48:31 +08:00
commit f9a44968bc
2 changed files with 28 additions and 3 deletions

View 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)

View 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 */
}