[WiFiScan] Allow allocation in _scanDone() to fail and prevent memory leak (#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
This commit is contained in:
TD-er 2024-09-16 11:26:43 +02:00 committed by GitHub
parent 44a484475c
commit 3978870f9f
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -48,7 +48,7 @@ uint32_t WiFiScanClass::_scanTimeout = 60000;
uint16_t WiFiScanClass::_scanCount = 0; uint16_t WiFiScanClass::_scanCount = 0;
uint32_t WiFiScanClass::_scanActiveMinTime = 100; uint32_t WiFiScanClass::_scanActiveMinTime = 100;
void *WiFiScanClass::_scanResult = 0; void *WiFiScanClass::_scanResult = nullptr;
void WiFiScanClass::setScanTimeout(uint32_t ms) { void WiFiScanClass::setScanTimeout(uint32_t ms) {
WiFiScanClass::_scanTimeout = ms; WiFiScanClass::_scanTimeout = ms;
@ -117,13 +117,18 @@ int16_t
*/ */
void WiFiScanClass::_scanDone() { void WiFiScanClass::_scanDone() {
esp_wifi_scan_get_ap_num(&(WiFiScanClass::_scanCount)); esp_wifi_scan_get_ap_num(&(WiFiScanClass::_scanCount));
if (WiFiScanClass::_scanResult) {
delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult);
WiFiScanClass::_scanResult = nullptr;
}
if (WiFiScanClass::_scanCount) { 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) { if (!WiFiScanClass::_scanResult) {
WiFiScanClass::_scanCount = 0; WiFiScanClass::_scanCount = 0;
} else if (esp_wifi_scan_get_ap_records(&(WiFiScanClass::_scanCount), (wifi_ap_record_t *)_scanResult) != ESP_OK) { } else if (esp_wifi_scan_get_ap_records(&(WiFiScanClass::_scanCount), (wifi_ap_record_t *)_scanResult) != ESP_OK) {
delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult); delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult);
WiFiScanClass::_scanResult = 0; WiFiScanClass::_scanResult = nullptr;
WiFiScanClass::_scanCount = 0; WiFiScanClass::_scanCount = 0;
} }
} }
@ -176,7 +181,7 @@ void WiFiScanClass::scanDelete() {
WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT); WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT);
if (WiFiScanClass::_scanResult) { if (WiFiScanClass::_scanResult) {
delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult); delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult);
WiFiScanClass::_scanResult = 0; WiFiScanClass::_scanResult = nullptr;
WiFiScanClass::_scanCount = 0; WiFiScanClass::_scanCount = 0;
} }
} }