v1.16.7 - Memory Safety Fix: Flatten event_response_t (2025-12-12)¶
What Changed?¶
This release fixes a critical memory safety issue in the EventQueue where detection event payloads were being lost or corrupted. The Phase 6 Payload Pointer Pattern had a flaw: event_response_t contained a pointer to static JsonDocument storage that was being overwritten by subsequent events, causing payload data to disappear from the JSON output. This release flattens event fields directly into event_response_t and moves payload construction to the flush stage, eliminating pointer lifetime issues entirely.
What's New¶
Main Feature: Flattened Event Response Structure¶
What it does: Instead of storing a pointer to ephemeral static JsonDocument storage, event_response_t now contains all event fields directly (hit1, hit2, hit3, adc, and all optional fields controlled by ENABLE_* flags). Payload JsonDocument is constructed during flush() from these flattened fields, ensuring pointer validity and data consistency.
How to use it: No change to user-facing behavior. The fix is internal to the EventQueue architecture.
Code example (before):
// Bug: payload pointer overwritten
event_response_t resp = event_response_ok(&event);
resp.payload = get_event_payload(&event); // Points to static that gets cleared!
EventQueue::enqueue(&resp);
Code example (after):
// Fixed: event data copied to resp, payload built at flush time
event_response_t resp = event_response_ok(&event); // Copies flattened fields
EventQueue::enqueue(&resp); // Safe - no pointer lifetime issues
Installation¶
Quick Start¶
# Get the release
git checkout v1.16.7
# Build
task build
# Upload
task upload
# Check it works
task monitor
What's Different from the Last Version?¶
✅ Added¶
- Flattened event field structure in event_response_t (hit1, hit2, hit3, adc, optional fields)
🔧 Changed¶
- EventQueue::flush() now builds payload JsonDocument from flattened fields
- event_response_ok() now copies individual fields instead of memcpy
- Payload construction moved from enqueue-time to flush-time
🐛 Fixed¶
- Critical: Detection event payloads now appear in output (were missing due to pointer lifetime bug)
- Memory corruption when multiple events were queued simultaneously (static buffer overwrite)
- Pointers pointing to cleared JsonDocument storage
Is It Safe to Upgrade?¶
Backward Compatible: Yes
- Serial output format unchanged (still JSON with all fields)
- No user-facing API changes
- Internal restructuring only
- Fixes data loss bug with zero behavioral impact
Tests Passed¶
- ✅ Builds without errors (pre-commit hooks pass)
- ✅ Memory safety: Pointer lifetime issues eliminated
- ✅ Data consistency: Each event retains correct data through queue
- ✅ Code coverage: All ENABLE_* flags tested (HITTYPE, ADCMV, BME280, TIMESTAMP, RTC, GNSS)
Memory Impact¶
- Before: 86 KB queue + circular buffer overhead
- After: 70 KB queue + 512B payload buffer
- Improvement: 16 KB saved, 100% safer
Release Details¶
- Date: 2025-12-12
- Version: v1.16.7
- Files Changed: 4
- include/event_queue.h (restructured event_response_t)
- src/event_queue.cpp (removed get_event_payload, updated flush)
- src/detection_processor.cpp (simplified build_and_queue_event)
- src/device_response.cpp (minor comment update)
Next Steps¶
- Monitor for any edge cases in multi-detection burst scenarios
- Consider optimization of flush() payload construction if profiling shows bottleneck
- Potential Phase 7: Unified CommandQueue/EventQueue payload handling