From 669ef89a6616eaa5b17b43f997a412db7ed8136c Mon Sep 17 00:00:00 2001 From: Ryan Malloy Date: Thu, 5 Feb 2026 09:59:49 -0700 Subject: [PATCH] fix: memory leaks and uninitialized pointers - Initialize _mqtt_bridge and _web_config to nullptr in declarations - Add destructor to clean up dynamically allocated objects - Initialize _last_mqtt_stats to 0 in declaration - Fix WiFiState/NetworkState enum mismatch in getWiFiStatus() While embedded firmware typically runs forever (making these not critical leaks), proper cleanup enables testing and prevents static analyzer warnings. --- src/MyMesh.cpp | 21 ++++++++++++++++++--- src/MyMesh.h | 11 ++++++----- 2 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/MyMesh.cpp b/src/MyMesh.cpp index 30c9a12..0ed8280 100644 --- a/src/MyMesh.cpp +++ b/src/MyMesh.cpp @@ -733,6 +733,21 @@ MyMesh::MyMesh(mesh::MainBoard &board, mesh::Radio &radio, mesh::MillisecondCloc _prefs.adc_multiplier = 0.0f; // 0.0f means use default board multiplier } +MyMesh::~MyMesh() { + // Clean up dynamically allocated resources +#ifdef WITH_MQTT + delete _web_config; + _web_config = nullptr; + delete _mqtt_bridge; + _mqtt_bridge = nullptr; +#endif + +#ifdef WITH_ETHERNET + delete _mqtt_bridge; + _mqtt_bridge = nullptr; +#endif +} + void MyMesh::begin(FILESYSTEM *fs) { mesh::Mesh::begin(); _fs = fs; @@ -1289,9 +1304,9 @@ const char* MyMesh::getMQTTStatus() const { const char* MyMesh::getWiFiStatus() const { switch (_wifi_mgr.getState()) { - case WiFiState::CONNECTED: return "connected"; - case WiFiState::CONNECTING: return "connecting"; - case WiFiState::AP_MODE: return "ap_mode"; + case NetworkState::CONNECTED: return "connected"; + case NetworkState::CONNECTING: return "connecting"; + case NetworkState::AP_MODE: return "ap_mode"; default: return "disconnected"; } } diff --git a/src/MyMesh.h b/src/MyMesh.h index c68f270..c99f7df 100644 --- a/src/MyMesh.h +++ b/src/MyMesh.h @@ -125,21 +125,21 @@ class MyMesh : public mesh::Mesh, public CommonCLICallbacks { #ifdef WITH_MQTT WiFiManager _wifi_mgr; - MQTTBridge* _mqtt_bridge; - WebConfig* _web_config; + MQTTBridge* _mqtt_bridge = nullptr; + WebConfig* _web_config = nullptr; WiFiConfig _wifi_config; MQTTConfig _mqtt_config; - unsigned long _last_mqtt_stats; + unsigned long _last_mqtt_stats = 0; void initMQTT(); #endif #ifdef WITH_ETHERNET EthernetManager _eth_mgr; - MQTTBridge* _mqtt_bridge; + MQTTBridge* _mqtt_bridge = nullptr; MQTTConfig _mqtt_config; EthernetConfig _eth_config; - unsigned long _last_mqtt_stats; + unsigned long _last_mqtt_stats = 0; void initEthernet(); #endif @@ -196,6 +196,7 @@ protected: public: MyMesh(mesh::MainBoard& board, mesh::Radio& radio, mesh::MillisecondClock& ms, mesh::RNG& rng, mesh::RTCClock& rtc, mesh::MeshTables& tables); + ~MyMesh(); // Clean up dynamically allocated resources void begin(FILESYSTEM* fs);