@alteriom/painlessmesh 1.8.14 → 1.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/BRIDGE_TO_INTERNET.md +229 -0
- package/CHANGELOG.md +89 -1
- package/CONTRIBUTING.md +79 -0
- package/README.md +70 -143
- package/docs/README.md +1 -0
- package/docs/api/shared-gateway.md +1207 -0
- package/docs/troubleshooting/common-issues.md +28 -0
- package/docs/troubleshooting/faq.md +113 -12
- package/examples/basic/test/simulator/CMakeLists.txt +40 -0
- package/examples/basic/test/simulator/README.md +149 -0
- package/examples/basic/test/simulator/firmware/basic_firmware.hpp +117 -0
- package/examples/basic/test/simulator/scenarios/basic_mesh_test.yaml +81 -0
- package/examples/bridge/bridge.ino +17 -4
- package/examples/bridge_failover/README.md +81 -0
- package/examples/bridge_failover/bridge_failover.ino +51 -6
- package/examples/sharedGateway/README.md +235 -0
- package/examples/{meshCommandNode → sharedGateway}/platformio.ini +3 -2
- package/examples/sharedGateway/sharedGateway.ino +303 -0
- package/library.json +3 -22
- package/library.properties +1 -1
- package/package.json +3 -3
- package/src/arduino/wifi.hpp +380 -13
- package/src/painlessmesh/gateway.hpp +2120 -0
- package/src/painlessmesh/mesh.hpp +1034 -6
- package/src/painlessmesh/message_tracker.hpp +311 -0
- package/src/painlessmesh/protocol.hpp +6 -0
- package/DOCUMENTATION_INDEX.md +0 -146
- package/docs/API_DESIGN_GUIDELINES.md +0 -414
- package/docs/ARDUINO_LIBRARY_MANAGER_SUBMISSION.md +0 -331
- package/docs/BOOLEAN_NAMING_CONVENTION.md +0 -235
- package/docs/BRIDGE_FAILOVER.md +0 -512
- package/docs/BRIDGE_HEALTH_MONITORING.md +0 -293
- package/docs/CHANNEL_SYNCHRONIZATION.md +0 -209
- package/docs/CREATE_MISSING_RELEASES.md +0 -321
- package/docs/DOCUMENTATION_MIGRATION_PLAN.md +0 -176
- package/docs/FAQ_VERSION_NUMBERS.md +0 -152
- package/docs/IMPLEMENTATION_PLAN_MESH_TOPOLOGY.md +0 -1062
- package/docs/MESH_TOPOLOGY_GUIDE.md +0 -992
- package/docs/MESH_TOPOLOGY_PROGRESS.md +0 -422
- package/docs/MQTT_BRIDGE_COMMANDS.md +0 -894
- package/docs/MQTT_BRIDGE_IMPLEMENTATION_SUMMARY.md +0 -324
- package/docs/MQTT_COMMAND_SCHEMA_PROPOSAL.md +0 -576
- package/docs/MQTT_SCHEMA_COMPLIANCE.md +0 -340
- package/docs/MQTT_SCHEMA_PROPOSALS.md +0 -446
- package/docs/MQTT_SCHEMA_REVIEW.md +0 -690
- package/docs/OTA_COMMANDS_REFERENCE.md +0 -554
- package/docs/PHASE1_GUIDE.md +0 -349
- package/docs/PHASE2_GUIDE.md +0 -543
- package/docs/QUICK_REFERENCE_VERSIONING.md +0 -127
- package/docs/RELEASE_AGENT_SUMMARY.md +0 -386
- package/docs/SCHEMA_VALIDATION_CHECKLIST.md +0 -222
- package/docs/VERSION_MANAGEMENT.md +0 -213
- package/docs/archive/DOCUSAURUS_DEPLOYMENT.md +0 -166
- package/docs/archive/FEATURE_PROPOSALS.md +0 -337
- package/docs/archive/LIBRARY_JSON_FIX.md +0 -98
- package/docs/archive/LIBRARY_STRUCTURE_FIX.md +0 -215
- package/docs/archive/PHASE1_IMPLEMENTATION.md +0 -325
- package/docs/archive/PHASE2_IMPLEMENTATION.md +0 -567
- package/docs/archive/RELEASE_SUMMARY.md +0 -173
- package/docs/archive/SCONS_BUILD_FIX.md +0 -313
- package/docs/archive/TRIGGER_RELEASE.md +0 -280
- package/docs/archive/VECTOR_INCLUDE_FIX.md +0 -129
- package/docs/archive/ota-and-status-enhancements.md +0 -911
- package/docs/archive/ota-status-architecture-diagrams.md +0 -658
- package/docs/archive/ota-status-quick-reference.md +0 -284
- package/docs/design/.gitkeep +0 -1
- package/docs/design/STATION_CREDENTIALS_DESIGN.md +0 -182
- package/docs/development/ARDUINO_COMPLIANCE_SUMMARY.md +0 -71
- package/docs/development/CODE_REFACTORING_RECOMMENDATIONS.md +0 -1011
- package/docs/development/DOCKER_TESTING.md +0 -196
- package/docs/development/PLATFORMIO_USAGE.md +0 -180
- package/docs/development/TESTING_SUMMARY.md +0 -126
- package/docs/development/contributing.md +0 -301
- package/docs/development/documentation.md +0 -583
- package/docs/features/DIAGNOSTICS_API.md +0 -534
- package/docs/implementation/BRIDGE_ARCHITECTURE_IMPLEMENTATION.md +0 -340
- package/docs/implementation/BRIDGE_HEALTH_MONITORING_IMPLEMENTATION.md +0 -213
- package/docs/implementation/BRIDGE_STATUS_FEATURE.md +0 -635
- package/docs/implementation/DIAGNOSTICS_API_IMPLEMENTATION.md +0 -232
- package/docs/implementation/IMPLEMENTATION_COMPLETE.md +0 -228
- package/docs/implementation/IMPLEMENTATION_NTP_TIME_SYNC.md +0 -325
- package/docs/implementation/IMPLEMENTATION_SUMMARY.md +0 -316
- package/docs/implementation/MESSAGE_QUEUE_IMPLEMENTATION.md +0 -405
- package/docs/implementation/MULTI_BRIDGE_IMPLEMENTATION.md +0 -520
- package/docs/implementation/NTP_TIME_SYNC_FEATURE.md +0 -392
- package/docs/improvements/FUTURE_PROPOSALS.md +0 -1016
- package/docs/improvements/IMPLEMENTATION_HISTORY.md +0 -1091
- package/docs/improvements/OTA_STATUS_ENHANCEMENTS.md +0 -709
- package/docs/improvements/README.md +0 -212
- package/docs/internal/CUSTOM_AGENT_ANALYSIS.md +0 -391
- package/docs/internal/ISSUE_65_VERIFICATION.md +0 -947
- package/docs/internal/ISSUE_66_CLOSURE.md +0 -249
- package/docs/internal/ISSUE_66_STATUS.md +0 -316
- package/docs/internal/PR_SUMMARY.md +0 -315
- package/docs/internal/REVIEW_SUMMARY.md +0 -332
- package/docs/multi-bridge-setup.md +0 -1025
- package/docs/platformio-publishing.md +0 -255
- package/docs/platformio-setup-summary.md +0 -121
- package/docs/releases/ANNOUNCEMENT_v1.8.6.md +0 -63
- package/docs/releases/ANNOUNCEMENT_v1.8.7.md +0 -113
- package/docs/releases/BRIDGE_STATUS_SELF_REGISTRATION_FIX.md +0 -221
- package/docs/releases/FEATURE_HISTORY.md +0 -543
- package/docs/releases/GITHUB_RELEASE_v1.8.6.md +0 -71
- package/docs/releases/GITHUB_RELEASE_v1.8.7.md +0 -90
- package/docs/releases/PATCH_v1.7.2.md +0 -262
- package/docs/releases/PATCH_v1.7.3.md +0 -262
- package/docs/releases/PATCH_v1.7.4.md +0 -219
- package/docs/releases/PHASE1_SUMMARY.md +0 -246
- package/docs/releases/PHASE2_SUMMARY.md +0 -499
- package/docs/releases/PUBLISH_v1.8.0_INSTRUCTIONS.md +0 -163
- package/docs/releases/QUICK_START_RELEASES.md +0 -113
- package/docs/releases/RELEASE_CHECKLIST_1.8.10.md +0 -331
- package/docs/releases/RELEASE_CHECKLIST_1.8.9.md +0 -207
- package/docs/releases/RELEASE_CHECKLIST_v1.7.4.md +0 -253
- package/docs/releases/RELEASE_CHECKLIST_v1.7.5.md +0 -315
- package/docs/releases/RELEASE_CHECKLIST_v1.7.6.md +0 -389
- package/docs/releases/RELEASE_CHECKLIST_v1.8.0.md +0 -331
- package/docs/releases/RELEASE_CHECKLIST_v1.8.2.md +0 -309
- package/docs/releases/RELEASE_NOTES_1.7.0.md +0 -539
- package/docs/releases/RELEASE_NOTES_1.8.10.md +0 -239
- package/docs/releases/RELEASE_NOTES_1.8.9.md +0 -213
- package/docs/releases/RELEASE_NOTES_v1.8.0.md +0 -685
- package/docs/releases/RELEASE_NOTES_v1.8.1.md +0 -221
- package/docs/releases/RELEASE_NOTES_v1.8.2.md +0 -421
- package/docs/releases/RELEASE_NOTES_v1.8.3.md +0 -292
- package/docs/releases/RELEASE_NOTES_v1.8.4.md +0 -277
- package/docs/releases/RELEASE_NOTES_v1.8.6.md +0 -205
- package/docs/releases/RELEASE_NOTES_v1.8.7.md +0 -184
- package/docs/releases/RELEASE_PLAN_v1.7.6.md +0 -816
- package/docs/releases/RELEASE_SUMMARY_1.8.10.md +0 -193
- package/docs/releases/RELEASE_SUMMARY_v1.7.4.md +0 -276
- package/docs/releases/RELEASE_SUMMARY_v1.7.5.md +0 -322
- package/docs/releases/RELEASE_SUMMARY_v1.7.6.md +0 -436
- package/docs/releases/RELEASE_SUMMARY_v1.7.7.md +0 -391
- package/docs/releases/RELEASE_SUMMARY_v1.7.8.md +0 -523
- package/docs/releases/RELEASE_SUMMARY_v1.7.9.md +0 -542
- package/docs/troubleshooting/ARDUINO_IDE_VERSION_FIX_SUMMARY.md +0 -229
- package/docs/troubleshooting/ARDUINO_LIBRARY_NAME_FIX.md +0 -197
- package/docs/troubleshooting/CRASH_QUICK_REF.md +0 -93
- package/docs/troubleshooting/ESP32_C6_COMPATIBILITY.md +0 -157
- package/docs/troubleshooting/FREERTOS_ASSERTION_FAILURE.md +0 -288
- package/docs/troubleshooting/FREERTOS_FIX_IMPLEMENTATION.md +0 -267
- package/docs/troubleshooting/NPM_PUBLISHING_ISSUE_SUMMARY.md +0 -110
- package/docs/troubleshooting/PAINLESSMESH_V1.7.4_COMPILATION_ISSUES.md +0 -547
- package/docs/troubleshooting/QUICK_FIX_FREERTOS.md +0 -164
- package/docs/troubleshooting/SENSOR_NODE_CONNECTION_CRASH.md +0 -264
- package/docs/troubleshooting/station-reconnection-issues.md +0 -172
- package/docs/v1.7.7_MQTT_IMPROVEMENTS.md +0 -794
- package/docs/wiki/API-Reference.md +0 -246
- package/docs/wiki/Complete-Documentation.md +0 -123
- package/examples/alteriomImproved/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomImproved/improved_sensor_node.ino +0 -248
- package/examples/alteriomImproved/platformio.ini +0 -32
- package/examples/alteriomMetricsHealth/alteriom_sensor_package.hpp +0 -796
- package/examples/alteriomMetricsHealth/metrics_health_node.ino +0 -429
- package/examples/alteriomMetricsHealth/platformio.ini +0 -26
- package/examples/alteriomPhase1/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomPhase1/phase1_features.ino +0 -242
- package/examples/alteriomPhase1/platformio.ini +0 -26
- package/examples/alteriomPhase2/alteriom_sensor_package.hpp +0 -224
- package/examples/alteriomPhase2/phase2_features.ino +0 -186
- package/examples/alteriomPhase2/platformio.ini +0 -26
- package/examples/alteriomSensorNode/alteriom_sensor_node.ino +0 -186
- package/examples/alteriomSensorNode/alteriom_sensor_package.hpp +0 -1227
- package/examples/alteriomSensorNode/platformio.ini +0 -26
- package/examples/bridge/alteriom_sensor_package.hpp +0 -1170
- package/examples/bridge/bridge_health_monitoring_example.ino +0 -188
- package/examples/bridge/enhanced_mqtt_bridge.hpp +0 -610
- package/examples/bridge/enhanced_mqtt_bridge_example.ino +0 -226
- package/examples/bridge/mesh_event_publisher.hpp +0 -253
- package/examples/bridge/mesh_topology_reporter.hpp +0 -303
- package/examples/bridge/mqtt_command_bridge.hpp +0 -459
- package/examples/bridge/mqtt_status_bridge.hpp +0 -519
- package/examples/bridgeAwareSensorNode/alteriom_sensor_package.hpp +0 -1227
- package/examples/bridgeAwareSensorNode/bridgeAwareSensorNode.ino +0 -342
- package/examples/bridgeAwareSensorNode/platformio.ini +0 -26
- package/examples/diagnosticsExample/diagnosticsExample.ino +0 -171
- package/examples/diagnosticsExample/platformio.ini +0 -26
- package/examples/echoNode/echoNode.ino +0 -33
- package/examples/echoNode/platformio.ini +0 -26
- package/examples/meshCommandNode/alteriom_sensor_package.hpp +0 -235
- package/examples/meshCommandNode/meshCommandNode.ino +0 -265
- package/examples/mqttCommandBridge/alteriom_sensor_package.hpp +0 -235
- package/examples/mqttCommandBridge/mesh_event_publisher.hpp +0 -253
- package/examples/mqttCommandBridge/mesh_topology_reporter.hpp +0 -303
- package/examples/mqttCommandBridge/mqttCommandBridge.ino +0 -254
- package/examples/mqttCommandBridge/mqtt_command_bridge.hpp +0 -462
- package/examples/mqttCommandBridge/platformio.ini +0 -27
- package/examples/mqttStatusBridge/mqttStatusBridge.ino +0 -218
- package/examples/mqttStatusBridge/mqtt_status_bridge.hpp +0 -522
- package/examples/mqttStatusBridge/platformio.ini +0 -27
- package/examples/mqttTopologyTest/README.md +0 -467
- package/examples/mqttTopologyTest/mqttTopologyTest.ino +0 -754
- package/examples/mqttTopologyTest/platformio.ini +0 -27
- package/examples/multi_bridge/README.md +0 -346
- package/examples/multi_bridge/primary_bridge.ino +0 -96
- package/examples/multi_bridge/regular_node.ino +0 -141
- package/examples/multi_bridge/secondary_bridge.ino +0 -111
- package/examples/ntpTimeSyncBridge/alteriom_sensor_package.hpp +0 -1383
- package/examples/ntpTimeSyncBridge/ntpTimeSyncBridge.ino +0 -86
- package/examples/ntpTimeSyncNode/alteriom_sensor_package.hpp +0 -1383
- package/examples/ntpTimeSyncNode/ntpTimeSyncNode.ino +0 -109
- package/examples/queued_alarms/README.md +0 -390
- package/examples/queued_alarms/queued_alarms.ino +0 -265
- package/examples/routing_demo/README.md +0 -172
- package/examples/routing_demo/routing_demo.ino +0 -102
- package/examples/rtcIntegration/README.md +0 -294
- package/examples/rtcIntegration/rtcIntegration.ino +0 -210
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
# Patch Release v1.7.2
|
|
2
|
-
|
|
3
|
-
**Release Date:** 2025-10-16
|
|
4
|
-
**Type:** Critical Bug Fix
|
|
5
|
-
**Branch:** main
|
|
6
|
-
|
|
7
|
-
## Overview
|
|
8
|
-
|
|
9
|
-
This patch release addresses a critical memory safety issue in the router JSON parsing logic that could lead to segmentation faults and unbounded memory growth.
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## Critical Fix
|
|
14
|
-
|
|
15
|
-
### Router JSON Parsing Segmentation Fault (P0)
|
|
16
|
-
|
|
17
|
-
**Issue:** The router used a workaround for a segmentation fault bug that involved dynamically growing memory capacity from 512B to 20KB through repeated allocations, causing:
|
|
18
|
-
|
|
19
|
-
- Memory leaks from abandoned `shared_ptr` allocations
|
|
20
|
-
- Unbounded memory growth (static variable never reset)
|
|
21
|
-
- Performance degradation on large packets
|
|
22
|
-
- Risk of OOM crashes on ESP8266 (80KB heap)
|
|
23
|
-
|
|
24
|
-
**Root Cause:** The original code attempted to work around an ArduinoJson copy constructor bug by repeatedly reallocating with larger capacities until parsing succeeded or capacity reached 20KB.
|
|
25
|
-
|
|
26
|
-
**Solution Implemented:**
|
|
27
|
-
|
|
28
|
-
1. **Pre-calculated Capacity:** Calculate required capacity upfront based on message size and nesting depth
|
|
29
|
-
2. **Version-Aware:** Different strategies for ArduinoJson v6 vs v7
|
|
30
|
-
3. **Safety Cap:** Maximum 8KB capacity to protect ESP8266 from OOM
|
|
31
|
-
4. **Better Error Handling:** Clear error messages when messages exceed capacity
|
|
32
|
-
5. **No Static State:** Eliminated the static `baseCapacity` variable
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## Changes
|
|
37
|
-
|
|
38
|
-
### Modified Files
|
|
39
|
-
|
|
40
|
-
#### src/painlessmesh/router.hpp (Lines 192-221)
|
|
41
|
-
|
|
42
|
-
```cpp
|
|
43
|
-
// Before (v1.7.0):
|
|
44
|
-
static size_t baseCapacity = 512;
|
|
45
|
-
auto variant = std::make_shared<protocol::Variant>(pkg, pkg.length() + baseCapacity);
|
|
46
|
-
while (variant->error == DeserializationError::NoMemory && baseCapacity <= 20480) {
|
|
47
|
-
baseCapacity += 256;
|
|
48
|
-
variant = std::make_shared<protocol::Variant>(pkg, pkg.length() + baseCapacity);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// After (v1.7.2):
|
|
52
|
-
size_t nestingDepth = std::count(pkg.begin(), pkg.end(), '{') +
|
|
53
|
-
std::count(pkg.begin(), pkg.end(), '[']);
|
|
54
|
-
|
|
55
|
-
#if ARDUINOJSON_VERSION_MAJOR >= 7
|
|
56
|
-
size_t calculatedCapacity = pkg.length() + 1024;
|
|
57
|
-
#else
|
|
58
|
-
size_t calculatedCapacity = pkg.length() +
|
|
59
|
-
JSON_OBJECT_SIZE(10) * std::max(nestingDepth, size_t(1)) +
|
|
60
|
-
512;
|
|
61
|
-
#endif
|
|
62
|
-
|
|
63
|
-
constexpr size_t MAX_MESSAGE_CAPACITY = 8192;
|
|
64
|
-
size_t capacity = std::min(calculatedCapacity, MAX_MESSAGE_CAPACITY);
|
|
65
|
-
auto variant = std::make_shared<protocol::Variant>(pkg, capacity);
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### New Files
|
|
69
|
-
|
|
70
|
-
#### test/catch/catch_router_memory.cpp
|
|
71
|
-
|
|
72
|
-
- Comprehensive tests for JSON parsing capacity calculation
|
|
73
|
-
- Tests for deeply nested messages
|
|
74
|
-
- Tests for oversized messages
|
|
75
|
-
- Tests for predictable memory allocation patterns
|
|
76
|
-
|
|
77
|
-
#### docs/development/CODE_REFACTORING_RECOMMENDATIONS.md
|
|
78
|
-
|
|
79
|
-
- Comprehensive code analysis document
|
|
80
|
-
- 8 prioritized refactoring recommendations (P0-P3)
|
|
81
|
-
- Implementation roadmap for v1.7.1 → v2.0.0
|
|
82
|
-
- Testing strategies and metrics
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## Testing
|
|
87
|
-
|
|
88
|
-
### Test Results
|
|
89
|
-
|
|
90
|
-
All tests passing:
|
|
91
|
-
|
|
92
|
-
```
|
|
93
|
-
✓ catch_alteriom_packages: 80 assertions in 7 test cases
|
|
94
|
-
✓ catch_base64: 2 assertions in 1 test case
|
|
95
|
-
✓ catch_buffer: 57 assertions in 2 test cases
|
|
96
|
-
✓ catch_callback: 6 assertions in 1 test case
|
|
97
|
-
✓ catch_connection: 6 assertions in 1 test case
|
|
98
|
-
✓ catch_layout: 25 assertions in 5 test cases
|
|
99
|
-
✓ catch_logger: 1 test case passed
|
|
100
|
-
✓ catch_metrics: 40 assertions in 5 test cases
|
|
101
|
-
✓ catch_mqtt_bridge: 59 assertions in 7 test cases
|
|
102
|
-
✓ catch_ntp: No tests (empty)
|
|
103
|
-
✓ catch_plugin: 25 assertions in 3 test cases
|
|
104
|
-
✓ catch_protocol: 187 assertions in 9 test cases
|
|
105
|
-
✓ catch_router: No tests (empty)
|
|
106
|
-
✓ catch_router_memory: 14 assertions in 2 test cases ← NEW
|
|
107
|
-
✓ catch_tcp: 3 assertions in 1 test case
|
|
108
|
-
✓ catch_tcp_integration: 113 assertions in 8 test cases
|
|
109
|
-
✓ catch_topology_schema: 16 assertions in 3 test cases
|
|
110
|
-
✓ catch_validation: 17 assertions in 4 test cases
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
**Total:** 710+ assertions passed
|
|
114
|
-
|
|
115
|
-
### Memory Safety Verification
|
|
116
|
-
|
|
117
|
-
The new tests verify:
|
|
118
|
-
|
|
119
|
-
1. **Simple messages** parse correctly with minimal capacity
|
|
120
|
-
2. **Deeply nested messages** (10+ levels) get appropriate capacity
|
|
121
|
-
3. **Oversized messages** are capped at MAX_MESSAGE_CAPACITY
|
|
122
|
-
4. **Capacity calculation** is predictable and doesn't grow unbounded
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
## Performance Impact
|
|
127
|
-
|
|
128
|
-
### Memory Usage (Before → After)
|
|
129
|
-
|
|
130
|
-
| Scenario | v1.7.0 | v1.7.2 | Change |
|
|
131
|
-
|----------|--------|--------|--------|
|
|
132
|
-
| Small message (50B) | 562B | 1074B | +512B |
|
|
133
|
-
| Medium message (500B) | 1012B → 5120B* | 1524B | -3596B* |
|
|
134
|
-
| Large message (2KB) | 2560B → 20KB* | 3072B | -17KB* |
|
|
135
|
-
| Nested message (10 levels) | variable | ~4KB | predictable |
|
|
136
|
-
|
|
137
|
-
*v1.7.0 would retry with growing capacity, potentially reaching 20KB
|
|
138
|
-
|
|
139
|
-
### Benefits
|
|
140
|
-
|
|
141
|
-
1. **No Memory Leaks:** Single allocation per message, no abandoned allocations
|
|
142
|
-
2. **Predictable:** Capacity calculated once, no runtime growth
|
|
143
|
-
3. **ESP8266 Safe:** 8KB cap prevents OOM on 80KB heap devices
|
|
144
|
-
4. **Better Errors:** Clear messages when capacity exceeded
|
|
145
|
-
|
|
146
|
-
---
|
|
147
|
-
|
|
148
|
-
## Migration Guide
|
|
149
|
-
|
|
150
|
-
### For Users
|
|
151
|
-
|
|
152
|
-
**No action required** - this is a transparent bug fix.
|
|
153
|
-
|
|
154
|
-
**If you see errors:**
|
|
155
|
-
|
|
156
|
-
```text
|
|
157
|
-
ERROR: routePackage(): Message too large. length=10000, calculated_capacity=12000, nesting_depth=5
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
**Options:**
|
|
161
|
-
|
|
162
|
-
1. Reduce message size (recommended)
|
|
163
|
-
2. Increase `MAX_MESSAGE_CAPACITY` in `router.hpp` (only if you have sufficient heap)
|
|
164
|
-
3. Split large messages into smaller chunks
|
|
165
|
-
|
|
166
|
-
### For Developers
|
|
167
|
-
|
|
168
|
-
**If extending mesh protocol:**
|
|
169
|
-
|
|
170
|
-
- Keep messages under 8KB total size
|
|
171
|
-
- Limit JSON nesting to < 20 levels
|
|
172
|
-
- Test with `catch_router_memory` tests
|
|
173
|
-
- Monitor heap usage with `ESP.getFreeHeap()`
|
|
174
|
-
|
|
175
|
-
---
|
|
176
|
-
|
|
177
|
-
## Known Limitations
|
|
178
|
-
|
|
179
|
-
1. **8KB Message Limit:** Messages larger than 8KB will be rejected
|
|
180
|
-
- **Workaround:** Split into multiple messages
|
|
181
|
-
- **Future:** May increase on ESP32 (320KB heap) in v2.0
|
|
182
|
-
|
|
183
|
-
2. **Deep Nesting Overhead:** Each nesting level adds ~200B overhead
|
|
184
|
-
- **Workaround:** Flatten JSON structures where possible
|
|
185
|
-
- **Impact:** 20-level nesting ≈ 4KB overhead
|
|
186
|
-
|
|
187
|
-
---
|
|
188
|
-
|
|
189
|
-
## References
|
|
190
|
-
|
|
191
|
-
### Related Issues
|
|
192
|
-
|
|
193
|
-
- #521 - ArduinoJson copy constructor segmentation fault
|
|
194
|
-
- [CODE_REFACTORING_RECOMMENDATIONS.md](../development/CODE_REFACTORING_RECOMMENDATIONS.md) - Full analysis
|
|
195
|
-
|
|
196
|
-
### Related Documentation
|
|
197
|
-
|
|
198
|
-
- [Router API](../api/router.md)
|
|
199
|
-
- [Protocol Specification](../api/protocol.md)
|
|
200
|
-
- [Memory Management](../troubleshooting/memory.md)
|
|
201
|
-
|
|
202
|
-
---
|
|
203
|
-
|
|
204
|
-
## Upgrade Instructions
|
|
205
|
-
|
|
206
|
-
### PlatformIO
|
|
207
|
-
|
|
208
|
-
```ini
|
|
209
|
-
[env:esp32]
|
|
210
|
-
lib_deps =
|
|
211
|
-
https://github.com/Alteriom/painlessMesh.git#v1.7.2
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
### Arduino IDE
|
|
215
|
-
|
|
216
|
-
1. Open Library Manager
|
|
217
|
-
2. Search for "painlessMesh"
|
|
218
|
-
3. Update to v1.7.2
|
|
219
|
-
|
|
220
|
-
### Manual
|
|
221
|
-
|
|
222
|
-
```bash
|
|
223
|
-
cd ~/Arduino/libraries/painlessMesh
|
|
224
|
-
git fetch
|
|
225
|
-
git checkout v1.7.2
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
---
|
|
229
|
-
|
|
230
|
-
## Checksums
|
|
231
|
-
|
|
232
|
-
**Release Archive:** `painlessMesh-v1.7.2.zip`
|
|
233
|
-
|
|
234
|
-
```text
|
|
235
|
-
MD5: [to be generated]
|
|
236
|
-
SHA256: [to be generated]
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
---
|
|
240
|
-
|
|
241
|
-
## Credits
|
|
242
|
-
|
|
243
|
-
**Fixed By:** GitHub Copilot + Alteriom Team
|
|
244
|
-
**Reported By:** Community (via segfault reports)
|
|
245
|
-
**Tested By:** Docker test suite (Linux x86_64)
|
|
246
|
-
|
|
247
|
-
---
|
|
248
|
-
|
|
249
|
-
## Next Steps
|
|
250
|
-
|
|
251
|
-
See [CODE_REFACTORING_RECOMMENDATIONS.md](../development/CODE_REFACTORING_RECOMMENDATIONS.md) for planned improvements in v1.8.0 and v2.0.0:
|
|
252
|
-
|
|
253
|
-
- **P1:** Implement hop count calculation (v1.8.0)
|
|
254
|
-
- **P1:** Implement routing table for multi-hop paths (v1.8.0)
|
|
255
|
-
- **P2:** Remove deprecated CONTROL message type (v1.9.0)
|
|
256
|
-
- **P3:** Improve NTP middle node behavior (v1.9.0)
|
|
257
|
-
|
|
258
|
-
---
|
|
259
|
-
|
|
260
|
-
**Document Status:** ✅ Complete
|
|
261
|
-
**Release Status:** 🚀 Ready for Tagging
|
|
262
|
-
**Next Release:** v1.8.0 (Planned: Q1 2026)
|
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
# Patch Release v1.7.3
|
|
2
|
-
|
|
3
|
-
**Release Date:** 2025-10-16
|
|
4
|
-
**Type:** Critical Bug Fix
|
|
5
|
-
**Branch:** main
|
|
6
|
-
|
|
7
|
-
## Overview
|
|
8
|
-
|
|
9
|
-
This patch release addresses a critical memory safety issue in the router JSON parsing logic that could lead to segmentation faults and unbounded memory growth.
|
|
10
|
-
|
|
11
|
-
---
|
|
12
|
-
|
|
13
|
-
## Critical Fix
|
|
14
|
-
|
|
15
|
-
### Router JSON Parsing Segmentation Fault (P0)
|
|
16
|
-
|
|
17
|
-
**Issue:** The router used a workaround for a segmentation fault bug that involved dynamically growing memory capacity from 512B to 20KB through repeated allocations, causing:
|
|
18
|
-
|
|
19
|
-
- Memory leaks from abandoned `shared_ptr` allocations
|
|
20
|
-
- Unbounded memory growth (static variable never reset)
|
|
21
|
-
- Performance degradation on large packets
|
|
22
|
-
- Risk of OOM crashes on ESP8266 (80KB heap)
|
|
23
|
-
|
|
24
|
-
**Root Cause:** The original code attempted to work around an ArduinoJson copy constructor bug by repeatedly reallocating with larger capacities until parsing succeeded or capacity reached 20KB.
|
|
25
|
-
|
|
26
|
-
**Solution Implemented:**
|
|
27
|
-
|
|
28
|
-
1. **Pre-calculated Capacity:** Calculate required capacity upfront based on message size and nesting depth
|
|
29
|
-
2. **Version-Aware:** Different strategies for ArduinoJson v6 vs v7
|
|
30
|
-
3. **Safety Cap:** Maximum 8KB capacity to protect ESP8266 from OOM
|
|
31
|
-
4. **Better Error Handling:** Clear error messages when messages exceed capacity
|
|
32
|
-
5. **No Static State:** Eliminated the static `baseCapacity` variable
|
|
33
|
-
|
|
34
|
-
---
|
|
35
|
-
|
|
36
|
-
## Changes
|
|
37
|
-
|
|
38
|
-
### Modified Files
|
|
39
|
-
|
|
40
|
-
#### src/painlessmesh/router.hpp (Lines 192-221)
|
|
41
|
-
|
|
42
|
-
```cpp
|
|
43
|
-
// Before (v1.7.0):
|
|
44
|
-
static size_t baseCapacity = 512;
|
|
45
|
-
auto variant = std::make_shared<protocol::Variant>(pkg, pkg.length() + baseCapacity);
|
|
46
|
-
while (variant->error == DeserializationError::NoMemory && baseCapacity <= 20480) {
|
|
47
|
-
baseCapacity += 256;
|
|
48
|
-
variant = std::make_shared<protocol::Variant>(pkg, pkg.length() + baseCapacity);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
// After (v1.7.3):
|
|
52
|
-
size_t nestingDepth = std::count(pkg.begin(), pkg.end(), '{') +
|
|
53
|
-
std::count(pkg.begin(), pkg.end(), '[']);
|
|
54
|
-
|
|
55
|
-
#if ARDUINOJSON_VERSION_MAJOR >= 7
|
|
56
|
-
size_t calculatedCapacity = pkg.length() + 1024;
|
|
57
|
-
#else
|
|
58
|
-
size_t calculatedCapacity = pkg.length() +
|
|
59
|
-
JSON_OBJECT_SIZE(10) * std::max(nestingDepth, size_t(1)) +
|
|
60
|
-
512;
|
|
61
|
-
#endif
|
|
62
|
-
|
|
63
|
-
constexpr size_t MAX_MESSAGE_CAPACITY = 8192;
|
|
64
|
-
size_t capacity = std::min(calculatedCapacity, MAX_MESSAGE_CAPACITY);
|
|
65
|
-
auto variant = std::make_shared<protocol::Variant>(pkg, capacity);
|
|
66
|
-
```
|
|
67
|
-
|
|
68
|
-
### New Files
|
|
69
|
-
|
|
70
|
-
#### test/catch/catch_router_memory.cpp
|
|
71
|
-
|
|
72
|
-
- Comprehensive tests for JSON parsing capacity calculation
|
|
73
|
-
- Tests for deeply nested messages
|
|
74
|
-
- Tests for oversized messages
|
|
75
|
-
- Tests for predictable memory allocation patterns
|
|
76
|
-
|
|
77
|
-
#### docs/development/CODE_REFACTORING_RECOMMENDATIONS.md
|
|
78
|
-
|
|
79
|
-
- Comprehensive code analysis document
|
|
80
|
-
- 8 prioritized refactoring recommendations (P0-P3)
|
|
81
|
-
- Implementation roadmap for v1.7.1 → v2.0.0
|
|
82
|
-
- Testing strategies and metrics
|
|
83
|
-
|
|
84
|
-
---
|
|
85
|
-
|
|
86
|
-
## Testing
|
|
87
|
-
|
|
88
|
-
### Test Results
|
|
89
|
-
|
|
90
|
-
All tests passing:
|
|
91
|
-
|
|
92
|
-
```
|
|
93
|
-
✓ catch_alteriom_packages: 80 assertions in 7 test cases
|
|
94
|
-
✓ catch_base64: 2 assertions in 1 test case
|
|
95
|
-
✓ catch_buffer: 57 assertions in 2 test cases
|
|
96
|
-
✓ catch_callback: 6 assertions in 1 test case
|
|
97
|
-
✓ catch_connection: 6 assertions in 1 test case
|
|
98
|
-
✓ catch_layout: 25 assertions in 5 test cases
|
|
99
|
-
✓ catch_logger: 1 test case passed
|
|
100
|
-
✓ catch_metrics: 40 assertions in 5 test cases
|
|
101
|
-
✓ catch_mqtt_bridge: 59 assertions in 7 test cases
|
|
102
|
-
✓ catch_ntp: No tests (empty)
|
|
103
|
-
✓ catch_plugin: 25 assertions in 3 test cases
|
|
104
|
-
✓ catch_protocol: 187 assertions in 9 test cases
|
|
105
|
-
✓ catch_router: No tests (empty)
|
|
106
|
-
✓ catch_router_memory: 14 assertions in 2 test cases ← NEW
|
|
107
|
-
✓ catch_tcp: 3 assertions in 1 test case
|
|
108
|
-
✓ catch_tcp_integration: 113 assertions in 8 test cases
|
|
109
|
-
✓ catch_topology_schema: 16 assertions in 3 test cases
|
|
110
|
-
✓ catch_validation: 17 assertions in 4 test cases
|
|
111
|
-
```
|
|
112
|
-
|
|
113
|
-
**Total:** 710+ assertions passed
|
|
114
|
-
|
|
115
|
-
### Memory Safety Verification
|
|
116
|
-
|
|
117
|
-
The new tests verify:
|
|
118
|
-
|
|
119
|
-
1. **Simple messages** parse correctly with minimal capacity
|
|
120
|
-
2. **Deeply nested messages** (10+ levels) get appropriate capacity
|
|
121
|
-
3. **Oversized messages** are capped at MAX_MESSAGE_CAPACITY
|
|
122
|
-
4. **Capacity calculation** is predictable and doesn't grow unbounded
|
|
123
|
-
|
|
124
|
-
---
|
|
125
|
-
|
|
126
|
-
## Performance Impact
|
|
127
|
-
|
|
128
|
-
### Memory Usage (Before → After)
|
|
129
|
-
|
|
130
|
-
| Scenario | v1.7.0 | v1.7.3 | Change |
|
|
131
|
-
|----------|--------|--------|--------|
|
|
132
|
-
| Small message (50B) | 562B | 1074B | +512B |
|
|
133
|
-
| Medium message (500B) | 1012B → 5120B* | 1524B | -3596B* |
|
|
134
|
-
| Large message (2KB) | 2560B → 20KB* | 3072B | -17KB* |
|
|
135
|
-
| Nested message (10 levels) | variable | ~4KB | predictable |
|
|
136
|
-
|
|
137
|
-
*v1.7.0 would retry with growing capacity, potentially reaching 20KB
|
|
138
|
-
|
|
139
|
-
### Benefits
|
|
140
|
-
|
|
141
|
-
1. **No Memory Leaks:** Single allocation per message, no abandoned allocations
|
|
142
|
-
2. **Predictable:** Capacity calculated once, no runtime growth
|
|
143
|
-
3. **ESP8266 Safe:** 8KB cap prevents OOM on 80KB heap devices
|
|
144
|
-
4. **Better Errors:** Clear messages when capacity exceeded
|
|
145
|
-
|
|
146
|
-
---
|
|
147
|
-
|
|
148
|
-
## Migration Guide
|
|
149
|
-
|
|
150
|
-
### For Users
|
|
151
|
-
|
|
152
|
-
**No action required** - this is a transparent bug fix.
|
|
153
|
-
|
|
154
|
-
**If you see errors:**
|
|
155
|
-
|
|
156
|
-
```text
|
|
157
|
-
ERROR: routePackage(): Message too large. length=10000, calculated_capacity=12000, nesting_depth=5
|
|
158
|
-
```
|
|
159
|
-
|
|
160
|
-
**Options:**
|
|
161
|
-
|
|
162
|
-
1. Reduce message size (recommended)
|
|
163
|
-
2. Increase `MAX_MESSAGE_CAPACITY` in `router.hpp` (only if you have sufficient heap)
|
|
164
|
-
3. Split large messages into smaller chunks
|
|
165
|
-
|
|
166
|
-
### For Developers
|
|
167
|
-
|
|
168
|
-
**If extending mesh protocol:**
|
|
169
|
-
|
|
170
|
-
- Keep messages under 8KB total size
|
|
171
|
-
- Limit JSON nesting to < 20 levels
|
|
172
|
-
- Test with `catch_router_memory` tests
|
|
173
|
-
- Monitor heap usage with `ESP.getFreeHeap()`
|
|
174
|
-
|
|
175
|
-
---
|
|
176
|
-
|
|
177
|
-
## Known Limitations
|
|
178
|
-
|
|
179
|
-
1. **8KB Message Limit:** Messages larger than 8KB will be rejected
|
|
180
|
-
- **Workaround:** Split into multiple messages
|
|
181
|
-
- **Future:** May increase on ESP32 (320KB heap) in v2.0
|
|
182
|
-
|
|
183
|
-
2. **Deep Nesting Overhead:** Each nesting level adds ~200B overhead
|
|
184
|
-
- **Workaround:** Flatten JSON structures where possible
|
|
185
|
-
- **Impact:** 20-level nesting ≈ 4KB overhead
|
|
186
|
-
|
|
187
|
-
---
|
|
188
|
-
|
|
189
|
-
## References
|
|
190
|
-
|
|
191
|
-
### Related Issues
|
|
192
|
-
|
|
193
|
-
- #521 - ArduinoJson copy constructor segmentation fault
|
|
194
|
-
- [CODE_REFACTORING_RECOMMENDATIONS.md](../development/CODE_REFACTORING_RECOMMENDATIONS.md) - Full analysis
|
|
195
|
-
|
|
196
|
-
### Related Documentation
|
|
197
|
-
|
|
198
|
-
- [Router API](../api/router.md)
|
|
199
|
-
- [Protocol Specification](../api/protocol.md)
|
|
200
|
-
- [Memory Management](../troubleshooting/memory.md)
|
|
201
|
-
|
|
202
|
-
---
|
|
203
|
-
|
|
204
|
-
## Upgrade Instructions
|
|
205
|
-
|
|
206
|
-
### PlatformIO
|
|
207
|
-
|
|
208
|
-
```ini
|
|
209
|
-
[env:esp32]
|
|
210
|
-
lib_deps =
|
|
211
|
-
https://github.com/Alteriom/painlessMesh.git#v1.7.3
|
|
212
|
-
```
|
|
213
|
-
|
|
214
|
-
### Arduino IDE
|
|
215
|
-
|
|
216
|
-
1. Open Library Manager
|
|
217
|
-
2. Search for "painlessMesh"
|
|
218
|
-
3. Update to v1.7.3
|
|
219
|
-
|
|
220
|
-
### Manual
|
|
221
|
-
|
|
222
|
-
```bash
|
|
223
|
-
cd ~/Arduino/libraries/painlessMesh
|
|
224
|
-
git fetch
|
|
225
|
-
git checkout v1.7.3
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
---
|
|
229
|
-
|
|
230
|
-
## Checksums
|
|
231
|
-
|
|
232
|
-
**Release Archive:** `painlessMesh-v1.7.3.zip`
|
|
233
|
-
|
|
234
|
-
```text
|
|
235
|
-
MD5: [to be generated]
|
|
236
|
-
SHA256: [to be generated]
|
|
237
|
-
```
|
|
238
|
-
|
|
239
|
-
---
|
|
240
|
-
|
|
241
|
-
## Credits
|
|
242
|
-
|
|
243
|
-
**Fixed By:** GitHub Copilot + Alteriom Team
|
|
244
|
-
**Reported By:** Community (via segfault reports)
|
|
245
|
-
**Tested By:** Docker test suite (Linux x86_64)
|
|
246
|
-
|
|
247
|
-
---
|
|
248
|
-
|
|
249
|
-
## Next Steps
|
|
250
|
-
|
|
251
|
-
See [CODE_REFACTORING_RECOMMENDATIONS.md](../development/CODE_REFACTORING_RECOMMENDATIONS.md) for planned improvements in v1.8.0 and v2.0.0:
|
|
252
|
-
|
|
253
|
-
- **P1:** Implement hop count calculation (v1.8.0)
|
|
254
|
-
- **P1:** Implement routing table for multi-hop paths (v1.8.0)
|
|
255
|
-
- **P2:** Remove deprecated CONTROL message type (v1.9.0)
|
|
256
|
-
- **P3:** Improve NTP middle node behavior (v1.9.0)
|
|
257
|
-
|
|
258
|
-
---
|
|
259
|
-
|
|
260
|
-
**Document Status:** ✅ Complete
|
|
261
|
-
**Release Status:** 🚀 Ready for Tagging
|
|
262
|
-
**Next Release:** v1.8.0 (Planned: Q1 2026)
|