mirror of
https://github.com/espressif/esp-idf.git
synced 2025-10-02 18:10:57 +02:00
fix(nvs_flash): Fixed overwrite of V1 BLOB when legacy compatibility mode is in place
This commit is contained in:
@@ -407,6 +407,27 @@ esp_err_t Storage::writeItem(uint8_t nsIndex, ItemType datatype, const char* key
|
|||||||
if(err == ESP_OK && findPage != nullptr) {
|
if(err == ESP_OK && findPage != nullptr) {
|
||||||
matchedTypePageFound = true;
|
matchedTypePageFound = true;
|
||||||
}
|
}
|
||||||
|
#ifdef CONFIG_NVS_LEGACY_DUP_KEYS_COMPATIBILITY
|
||||||
|
// In legacy mode, we also try to find the item as BLOB if not found as BLOB_INDEX.
|
||||||
|
// In this mode, it is possible to have multiple active values under the same (logical) key.
|
||||||
|
// For BLOBs (which may have different physical representations in V1 it is BLOB, in V2 it is BLOB_INDEX) it in turn means
|
||||||
|
// that we have to check both datatypes to find the old value.
|
||||||
|
// The general case for compatibility flag disabled is below and handles all datatypes including BLOB.
|
||||||
|
// To save some cycles, we do not compile both findItem calls in this case.
|
||||||
|
if(err == ESP_ERR_NVS_NOT_FOUND) {
|
||||||
|
// If not found as BLOB_INDEX, try to find it as BLOB (legacy support).
|
||||||
|
err = findItem(nsIndex, ItemType::BLOB, key, findPage, item, Page::CHUNK_ANY, VerOffset::VER_ANY, &itemIndex);
|
||||||
|
if(err == ESP_OK && findPage != nullptr) {
|
||||||
|
matchedTypePageFound = false; // datatype does not match, we cannot extract chunkStart from the item
|
||||||
|
|
||||||
|
// keep the sequence number of the page where the item was found for later check of relocation
|
||||||
|
err = findPage->getSeqNumber(findPageSeqNumber);
|
||||||
|
if(err != ESP_OK) {
|
||||||
|
return err;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
} else {
|
} else {
|
||||||
// Handle all other data types than BLOB
|
// Handle all other data types than BLOB
|
||||||
err = findItem(nsIndex, datatype, key, findPage, item, Page::CHUNK_ANY, VerOffset::VER_ANY, &itemIndex);
|
err = findItem(nsIndex, datatype, key, findPage, item, Page::CHUNK_ANY, VerOffset::VER_ANY, &itemIndex);
|
||||||
|
Reference in New Issue
Block a user