mirror of
https://github.com/MarekZegare4/MeshCore-Solo.git
synced 2026-07-26 14:58:12 +00:00
fix(companion): channel save/lookup hardening + trail count guard
Address the open items from the FEATURES.md audit backlog: - saveChannels() now skips unused slots (all-zero secret) instead of writing all 40 every time, so /channels2 holds only configured channels (was always ~2.7 KB) and wears the flash less. loadChannels() already compacted empties on read, so the loaded result is unchanged. - findChannelIdx() returns -1 for an all-zero secret, so a corrupted/empty channel can't match an unused all-zero slot and misroute messages. - TrailStore gains a static_assert that CAPACITY fits the uint16_t save header count, failing the build instead of silently truncating. Also re-classify two audit items verified to be non-issues in current code: the bot strstr "199-char" truncation (BOT_SCRATCH=200 >= MAX_TEXT_LEN =160, unreachable) and the MSG_PICK reply title (rlen clamped to 20, so title[24] never overflows). Verified: WioTrackerL1_companion_solo_dual builds clean. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -685,12 +685,19 @@ void DataStore::saveChannels(DataStoreHost* host) {
|
||||
memset(unused, 0, 4);
|
||||
|
||||
while (host->getChannelForSave(channel_idx, ch)) {
|
||||
channel_idx++;
|
||||
// getChannelForSave() returns every slot up to MAX_GROUP_CHANNELS, so skip
|
||||
// the unused ones (all-zero secret) rather than writing all 40 — otherwise
|
||||
// the file is always ~2.7 KB and wears the flash needlessly. loadChannels()
|
||||
// already compacts empty entries on read, so the loaded result is identical.
|
||||
bool empty = true;
|
||||
for (int b = 0; b < 32; b++) if (ch.channel.secret[b]) { empty = false; break; }
|
||||
if (empty) continue;
|
||||
|
||||
bool success = (file.write(unused, 4) == 4);
|
||||
success = success && (file.write((uint8_t *)ch.name, 32) == 32);
|
||||
success = success && (file.write((uint8_t *)ch.channel.secret, 32) == 32);
|
||||
|
||||
if (!success) break; // write failed
|
||||
channel_idx++;
|
||||
}
|
||||
file.close();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user