Skip to content

Commit 4daad75

Browse files
authored
Merge pull request #806 from oltaco/safer-lfs-traverse
Safer _countLfsBlock / _getLfsUsedBlockCount
2 parents 757ff9f + 2922b62 commit 4daad75

File tree

1 file changed

+15
-2
lines changed

1 file changed

+15
-2
lines changed

examples/companion_radio/DataStore.cpp

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,17 @@ static File openWrite(FILESYSTEM* fs, const char* filename) {
4242
#endif
4343
}
4444

45+
#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
46+
static uint32_t _ContactsChannelsTotalBlocks = 0;
47+
#endif
48+
4549
void DataStore::begin() {
4650
#if defined(RP2040_PLATFORM)
4751
identity_store.begin();
4852
#endif
4953

5054
#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
55+
_ContactsChannelsTotalBlocks = _getContactsChannelsFS()->_getFS()->cfg->block_count;
5156
checkAdvBlobFile();
5257
#if defined(EXTRAFS) || defined(QSPIFLASH)
5358
migrateToSecondaryFS();
@@ -74,14 +79,22 @@ void DataStore::begin() {
7479

7580
#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
7681
int _countLfsBlock(void *p, lfs_block_t block){
82+
if (block > _ContactsChannelsTotalBlocks) {
83+
MESH_DEBUG_PRINTLN("ERROR: Block %d exceeds filesystem bounds - CORRUPTION DETECTED!", block);
84+
return LFS_ERR_CORRUPT; // return error to abort lfs_traverse() gracefully
85+
}
7786
lfs_size_t *size = (lfs_size_t*) p;
7887
*size += 1;
79-
return 0;
88+
return 0;
8089
}
8190

8291
lfs_ssize_t _getLfsUsedBlockCount(FILESYSTEM* fs) {
8392
lfs_size_t size = 0;
84-
lfs_traverse(fs->_getFS(), _countLfsBlock, &size);
93+
int err = lfs_traverse(fs->_getFS(), _countLfsBlock, &size);
94+
if (err) {
95+
MESH_DEBUG_PRINTLN("ERROR: lfs_traverse() error: %d", err);
96+
return 0;
97+
}
8598
return size;
8699
}
87100
#endif

0 commit comments

Comments
 (0)