Skip to content

Commit 0b8f661

Browse files
committed
Merge branch 'bugfix/storage_nvs_key_overwrite' into 'master'
fix(nvs): fixed erasing of old values if new data type is not the same Closes IDFGH-14832 See merge request espressif/esp-idf!37888
2 parents 7dd093f + d9bc77e commit 0b8f661

File tree

2 files changed

+327
-187
lines changed

2 files changed

+327
-187
lines changed

components/nvs_flash/host_test/nvs_host_test/main/test_nvs.cpp

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2015-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2015-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -3808,6 +3808,82 @@ TEST_CASE("nvs multiple write with same key but different types", "[nvs]")
38083808
TEST_ESP_OK(nvs_flash_deinit_partition(NVS_DEFAULT_PART_NAME));
38093809
}
38103810

3811+
TEST_CASE("nvs multiple write with same key blob and string involved", "[nvs]")
3812+
{
3813+
PartitionEmulationFixture f(0, 10);
3814+
3815+
nvs_handle_t handle_1;
3816+
const uint32_t NVS_FLASH_SECTOR = 6;
3817+
const uint32_t NVS_FLASH_SECTOR_COUNT_MIN = 3;
3818+
TEMPORARILY_DISABLED(f.emu.setBounds(NVS_FLASH_SECTOR, NVS_FLASH_SECTOR + NVS_FLASH_SECTOR_COUNT_MIN);)
3819+
3820+
for (uint16_t j = NVS_FLASH_SECTOR; j < NVS_FLASH_SECTOR + NVS_FLASH_SECTOR_COUNT_MIN; ++j) {
3821+
f.erase(j);
3822+
}
3823+
TEST_ESP_OK(nvs::NVSPartitionManager::get_instance()->init_custom(f.part(),
3824+
NVS_FLASH_SECTOR,
3825+
NVS_FLASH_SECTOR_COUNT_MIN));
3826+
3827+
TEST_ESP_OK(nvs_open("namespace1", NVS_READWRITE, &handle_1));
3828+
3829+
nvs_erase_all(handle_1);
3830+
3831+
const char key_name[] = "foo";
3832+
3833+
// integer variables
3834+
int32_t v32;
3835+
int8_t v8;
3836+
3837+
// string
3838+
#define str_data_len 64
3839+
const char str_data[] = "string data";
3840+
char str_buf[str_data_len] = {0};
3841+
size_t str_len = str_data_len;
3842+
3843+
// blob
3844+
#define blob_data_len 64
3845+
uint8_t blob_data[blob_data_len] = {0};
3846+
uint8_t blob_buf[blob_data_len] = {0};
3847+
size_t blob_read_size;
3848+
3849+
// first write is i32
3850+
TEST_ESP_OK(nvs_set_i32(handle_1, key_name, (int32_t)12345678));
3851+
3852+
TEST_ESP_ERR(nvs_get_i8(handle_1, key_name, &v8), ESP_ERR_NVS_NOT_FOUND);
3853+
TEST_ESP_OK(nvs_get_i32(handle_1, key_name, &v32));
3854+
TEST_ESP_ERR(nvs_get_str(handle_1, key_name, str_buf, &str_len), ESP_ERR_NVS_NOT_FOUND);
3855+
TEST_ESP_ERR(nvs_get_blob(handle_1, key_name, blob_buf, &blob_read_size), ESP_ERR_NVS_NOT_FOUND);
3856+
3857+
3858+
// second write is string
3859+
TEST_ESP_OK(nvs_set_str(handle_1, key_name, str_data));
3860+
3861+
TEST_ESP_ERR(nvs_get_i8(handle_1, key_name, &v8), ESP_ERR_NVS_NOT_FOUND);
3862+
TEST_ESP_ERR(nvs_get_i32(handle_1, key_name, &v32), ESP_ERR_NVS_NOT_FOUND);
3863+
TEST_ESP_OK(nvs_get_str(handle_1, key_name, str_buf, &str_len));
3864+
TEST_ESP_ERR(nvs_get_blob(handle_1, key_name, blob_buf, &blob_read_size), ESP_ERR_NVS_NOT_FOUND);
3865+
3866+
// third write is blob
3867+
TEST_ESP_OK(nvs_set_blob(handle_1, key_name, blob_data, blob_data_len));
3868+
3869+
TEST_ESP_ERR(nvs_get_i8(handle_1, key_name, &v8), ESP_ERR_NVS_NOT_FOUND);
3870+
TEST_ESP_ERR(nvs_get_i32(handle_1, key_name, &v32), ESP_ERR_NVS_NOT_FOUND);
3871+
TEST_ESP_ERR(nvs_get_str(handle_1, key_name, str_buf, &str_len), ESP_ERR_NVS_NOT_FOUND);
3872+
TEST_ESP_OK(nvs_get_blob(handle_1, key_name, blob_buf, &blob_read_size));
3873+
3874+
// fourth write is i8
3875+
TEST_ESP_OK(nvs_set_i8(handle_1, key_name, (int8_t)12));
3876+
3877+
TEST_ESP_OK(nvs_get_i8(handle_1, key_name, &v8));
3878+
TEST_ESP_ERR(nvs_get_i32(handle_1, key_name, &v32), ESP_ERR_NVS_NOT_FOUND);
3879+
TEST_ESP_ERR(nvs_get_str(handle_1, key_name, str_buf, &str_len), ESP_ERR_NVS_NOT_FOUND);
3880+
TEST_ESP_ERR(nvs_get_blob(handle_1, key_name, blob_buf, &blob_read_size), ESP_ERR_NVS_NOT_FOUND);
3881+
3882+
nvs_close(handle_1);
3883+
3884+
TEST_ESP_OK(nvs_flash_deinit_partition(NVS_DEFAULT_PART_NAME));
3885+
}
3886+
38113887
TEST_CASE("nvs find key tests", "[nvs]")
38123888
{
38133889
const size_t buff_len = 4096;

0 commit comments

Comments
 (0)