Merge branch 'bugfix/nvs_corrupted_storage_crashes_app' into 'master'

[NVS]: fix crashes from entry state 1

See merge request espressif/esp-idf!14548
This commit is contained in:
Jakob Hasse
2021-08-06 09:14:21 +00:00
8 changed files with 100 additions and 18 deletions
+13 -2
View File
@@ -389,8 +389,9 @@ esp_err_t Page::findItem(uint8_t nsIndex, ItemType datatype, const char* key, ui
esp_err_t Page::eraseEntryAndSpan(size_t index)
{
uint32_t seq_num;
getSeqNumber(seq_num);
auto state = mEntryTable.get(index);
assert(state == EntryState::WRITTEN || state == EntryState::EMPTY);
size_t span = 1;
if (state == EntryState::WRITTEN) {
@@ -400,7 +401,7 @@ esp_err_t Page::eraseEntryAndSpan(size_t index)
return rc;
}
if (item.calculateCrc32() != item.crc32) {
mHashList.erase(index, false);
mHashList.erase(index);
rc = alterEntryState(index, EntryState::ERASED);
--mUsedEntryCount;
++mErasedEntryCount;
@@ -597,6 +598,16 @@ esp_err_t Page::mLoadEntryTable()
continue;
}
if (mEntryTable.get(i) == EntryState::ILLEGAL) {
lastItemIndex = INVALID_ENTRY;
auto err = eraseEntryAndSpan(i);
if (err != ESP_OK) {
mState = PageState::INVALID;
return err;
}
continue;
}
lastItemIndex = i;
auto err = readEntry(i, item);