Skip to content

Commit 3978870

Browse files
authored
[WiFiScan] Allow allocation in _scanDone() to fail and prevent memory leak (espressif#10335)
* [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. * [WiFiScan] Use nullptr instead of 0 As suggested by @me-no-dev
1 parent 44a4844 commit 3978870

File tree

1 file changed

+9
-4
lines changed

1 file changed

+9
-4
lines changed

libraries/WiFi/src/WiFiScan.cpp

+9-4
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ uint32_t WiFiScanClass::_scanTimeout = 60000;
4848
uint16_t WiFiScanClass::_scanCount = 0;
4949
uint32_t WiFiScanClass::_scanActiveMinTime = 100;
5050

51-
void *WiFiScanClass::_scanResult = 0;
51+
void *WiFiScanClass::_scanResult = nullptr;
5252

5353
void WiFiScanClass::setScanTimeout(uint32_t ms) {
5454
WiFiScanClass::_scanTimeout = ms;
@@ -117,13 +117,18 @@ int16_t
117117
*/
118118
void WiFiScanClass::_scanDone() {
119119
esp_wifi_scan_get_ap_num(&(WiFiScanClass::_scanCount));
120+
if (WiFiScanClass::_scanResult) {
121+
delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult);
122+
WiFiScanClass::_scanResult = nullptr;
123+
}
124+
120125
if (WiFiScanClass::_scanCount) {
121-
WiFiScanClass::_scanResult = new wifi_ap_record_t[WiFiScanClass::_scanCount];
126+
WiFiScanClass::_scanResult = new (std::nothrow) wifi_ap_record_t[WiFiScanClass::_scanCount];
122127
if (!WiFiScanClass::_scanResult) {
123128
WiFiScanClass::_scanCount = 0;
124129
} else if (esp_wifi_scan_get_ap_records(&(WiFiScanClass::_scanCount), (wifi_ap_record_t *)_scanResult) != ESP_OK) {
125130
delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult);
126-
WiFiScanClass::_scanResult = 0;
131+
WiFiScanClass::_scanResult = nullptr;
127132
WiFiScanClass::_scanCount = 0;
128133
}
129134
}
@@ -176,7 +181,7 @@ void WiFiScanClass::scanDelete() {
176181
WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT);
177182
if (WiFiScanClass::_scanResult) {
178183
delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult);
179-
WiFiScanClass::_scanResult = 0;
184+
WiFiScanClass::_scanResult = nullptr;
180185
WiFiScanClass::_scanCount = 0;
181186
}
182187
}

0 commit comments

Comments
 (0)