Merge pull request #806 from oltaco/safer-lfs-traverse

Safer _countLfsBlock / _getLfsUsedBlockCount
This commit is contained in:
ripplebiz 2025-09-21 00:00:19 +10:00 committed by GitHub
commit 4daad75f7d
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -42,12 +42,17 @@ static File openWrite(FILESYSTEM* fs, const char* filename) {
#endif #endif
} }
#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
static uint32_t _ContactsChannelsTotalBlocks = 0;
#endif
void DataStore::begin() { void DataStore::begin() {
#if defined(RP2040_PLATFORM) #if defined(RP2040_PLATFORM)
identity_store.begin(); identity_store.begin();
#endif #endif
#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) #if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
_ContactsChannelsTotalBlocks = _getContactsChannelsFS()->_getFS()->cfg->block_count;
checkAdvBlobFile(); checkAdvBlobFile();
#if defined(EXTRAFS) || defined(QSPIFLASH) #if defined(EXTRAFS) || defined(QSPIFLASH)
migrateToSecondaryFS(); migrateToSecondaryFS();
@ -74,14 +79,22 @@ void DataStore::begin() {
#if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM) #if defined(NRF52_PLATFORM) || defined(STM32_PLATFORM)
int _countLfsBlock(void *p, lfs_block_t block){ int _countLfsBlock(void *p, lfs_block_t block){
if (block > _ContactsChannelsTotalBlocks) {
MESH_DEBUG_PRINTLN("ERROR: Block %d exceeds filesystem bounds - CORRUPTION DETECTED!", block);
return LFS_ERR_CORRUPT; // return error to abort lfs_traverse() gracefully
}
lfs_size_t *size = (lfs_size_t*) p; lfs_size_t *size = (lfs_size_t*) p;
*size += 1; *size += 1;
return 0; return 0;
} }
lfs_ssize_t _getLfsUsedBlockCount(FILESYSTEM* fs) { lfs_ssize_t _getLfsUsedBlockCount(FILESYSTEM* fs) {
lfs_size_t size = 0; lfs_size_t size = 0;
lfs_traverse(fs->_getFS(), _countLfsBlock, &size); int err = lfs_traverse(fs->_getFS(), _countLfsBlock, &size);
if (err) {
MESH_DEBUG_PRINTLN("ERROR: lfs_traverse() error: %d", err);
return 0;
}
return size; return size;
} }
#endif #endif