From f2d83e56ea843131a84f06c24ced076e45ba4d8a Mon Sep 17 00:00:00 2001 From: TD-er Date: Thu, 12 Sep 2024 17:39:38 +0200 Subject: [PATCH 1/2] [WiFiScan] Allow allocation to fail and prevent memory leak When there are many AP's seen during a scan, the allocation of `_scanResult` may fail. Thus add `(std::nothrow)` to the `new` call. Also it is possible the array was still present before allocating a new one. --- libraries/WiFi/src/WiFiScan.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/libraries/WiFi/src/WiFiScan.cpp b/libraries/WiFi/src/WiFiScan.cpp index 9ebf28f8fde..f746fb1a3b9 100644 --- a/libraries/WiFi/src/WiFiScan.cpp +++ b/libraries/WiFi/src/WiFiScan.cpp @@ -117,8 +117,13 @@ int16_t */ void WiFiScanClass::_scanDone() { esp_wifi_scan_get_ap_num(&(WiFiScanClass::_scanCount)); + if (WiFiScanClass::_scanResult) { + delete[] reinterpret_cast(WiFiScanClass::_scanResult); + WiFiScanClass::_scanResult = 0; + } + if (WiFiScanClass::_scanCount) { - WiFiScanClass::_scanResult = new wifi_ap_record_t[WiFiScanClass::_scanCount]; + WiFiScanClass::_scanResult = new (std::nothrow) wifi_ap_record_t[WiFiScanClass::_scanCount]; if (!WiFiScanClass::_scanResult) { WiFiScanClass::_scanCount = 0; } else if (esp_wifi_scan_get_ap_records(&(WiFiScanClass::_scanCount), (wifi_ap_record_t *)_scanResult) != ESP_OK) { From ed52765d546edd9af029530c9e61de8c6712dd77 Mon Sep 17 00:00:00 2001 From: TD-er Date: Fri, 13 Sep 2024 20:06:54 +0200 Subject: [PATCH 2/2] [WiFiScan] Use nullptr instead of 0 As suggested by @me-no-dev --- libraries/WiFi/src/WiFiScan.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/libraries/WiFi/src/WiFiScan.cpp b/libraries/WiFi/src/WiFiScan.cpp index f746fb1a3b9..ffacc57f093 100644 --- a/libraries/WiFi/src/WiFiScan.cpp +++ b/libraries/WiFi/src/WiFiScan.cpp @@ -48,7 +48,7 @@ uint32_t WiFiScanClass::_scanTimeout = 60000; uint16_t WiFiScanClass::_scanCount = 0; uint32_t WiFiScanClass::_scanActiveMinTime = 100; -void *WiFiScanClass::_scanResult = 0; +void *WiFiScanClass::_scanResult = nullptr; void WiFiScanClass::setScanTimeout(uint32_t ms) { WiFiScanClass::_scanTimeout = ms; @@ -119,7 +119,7 @@ void WiFiScanClass::_scanDone() { esp_wifi_scan_get_ap_num(&(WiFiScanClass::_scanCount)); if (WiFiScanClass::_scanResult) { delete[] reinterpret_cast(WiFiScanClass::_scanResult); - WiFiScanClass::_scanResult = 0; + WiFiScanClass::_scanResult = nullptr; } if (WiFiScanClass::_scanCount) { @@ -128,7 +128,7 @@ void WiFiScanClass::_scanDone() { WiFiScanClass::_scanCount = 0; } else if (esp_wifi_scan_get_ap_records(&(WiFiScanClass::_scanCount), (wifi_ap_record_t *)_scanResult) != ESP_OK) { delete[] reinterpret_cast(WiFiScanClass::_scanResult); - WiFiScanClass::_scanResult = 0; + WiFiScanClass::_scanResult = nullptr; WiFiScanClass::_scanCount = 0; } } @@ -181,7 +181,7 @@ void WiFiScanClass::scanDelete() { WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT); if (WiFiScanClass::_scanResult) { delete[] reinterpret_cast(WiFiScanClass::_scanResult); - WiFiScanClass::_scanResult = 0; + WiFiScanClass::_scanResult = nullptr; WiFiScanClass::_scanCount = 0; } }