Skip to content

Commit 1725893

Browse files
authored
fix(wifi_scan): Fix some edge cases where WiFi Scan may fail (#11188)
1 parent e37435c commit 1725893

File tree

1 file changed

+14
-19
lines changed

1 file changed

+14
-19
lines changed

Diff for: libraries/WiFi/src/WiFiScan.cpp

+14-19
Original file line numberDiff line numberDiff line change
@@ -92,9 +92,6 @@ int16_t
9292
}
9393
if (esp_wifi_scan_start(&config, false) == ESP_OK) {
9494
_scanStarted = millis();
95-
if (!_scanStarted) { //Prevent 0 from millis overflow
96-
++_scanStarted;
97-
}
9895

9996
WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT);
10097
WiFiGenericClass::setStatusBits(WIFI_SCANNING_BIT);
@@ -118,21 +115,20 @@ int16_t
118115
void WiFiScanClass::_scanDone() {
119116
esp_wifi_scan_get_ap_num(&(WiFiScanClass::_scanCount));
120117
if (WiFiScanClass::_scanResult) {
121-
delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult);
122-
WiFiScanClass::_scanResult = nullptr;
118+
free(WiFiScanClass::_scanResult);
119+
WiFiScanClass::_scanResult = NULL;
123120
}
124121

125122
if (WiFiScanClass::_scanCount) {
126-
WiFiScanClass::_scanResult = new (std::nothrow) wifi_ap_record_t[WiFiScanClass::_scanCount];
123+
WiFiScanClass::_scanResult = calloc(WiFiScanClass::_scanCount, sizeof(wifi_ap_record_t));
127124
if (!WiFiScanClass::_scanResult) {
128125
WiFiScanClass::_scanCount = 0;
129126
} else if (esp_wifi_scan_get_ap_records(&(WiFiScanClass::_scanCount), (wifi_ap_record_t *)_scanResult) != ESP_OK) {
130-
delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult);
131-
WiFiScanClass::_scanResult = nullptr;
127+
free(WiFiScanClass::_scanResult);
128+
WiFiScanClass::_scanResult = NULL;
132129
WiFiScanClass::_scanCount = 0;
133130
}
134131
}
135-
WiFiScanClass::_scanStarted = 0; //Reset after a scan is completed for normal behavior
136132
WiFiGenericClass::setStatusBits(WIFI_SCAN_DONE_BIT);
137133
WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT);
138134
}
@@ -161,15 +157,13 @@ int16_t WiFiScanClass::scanComplete() {
161157
}
162158

163159
if (WiFiGenericClass::getStatusBits() & WIFI_SCANNING_BIT) {
160+
// Check if the delay expired, return WIFI_SCAN_FAILED in this case
161+
if ((millis() - WiFiScanClass::_scanStarted) > WiFiScanClass::_scanTimeout) {
162+
WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT);
163+
return WIFI_SCAN_FAILED;
164+
}
164165
return WIFI_SCAN_RUNNING;
165166
}
166-
// last one to avoid time affecting Async mode
167-
if (WiFiScanClass::_scanStarted
168-
&& (millis() - WiFiScanClass::_scanStarted)
169-
> WiFiScanClass::_scanTimeout) { //Check is scan was started and if the delay expired, return WIFI_SCAN_FAILED in this case
170-
WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT);
171-
return WIFI_SCAN_FAILED;
172-
}
173167

174168
return WIFI_SCAN_FAILED;
175169
}
@@ -179,11 +173,12 @@ int16_t WiFiScanClass::scanComplete() {
179173
*/
180174
void WiFiScanClass::scanDelete() {
181175
WiFiGenericClass::clearStatusBits(WIFI_SCAN_DONE_BIT);
176+
WiFiGenericClass::clearStatusBits(WIFI_SCANNING_BIT);
182177
if (WiFiScanClass::_scanResult) {
183-
delete[] reinterpret_cast<wifi_ap_record_t *>(WiFiScanClass::_scanResult);
184-
WiFiScanClass::_scanResult = nullptr;
185-
WiFiScanClass::_scanCount = 0;
178+
free(WiFiScanClass::_scanResult);
179+
WiFiScanClass::_scanResult = NULL;
186180
}
181+
WiFiScanClass::_scanCount = 0;
187182
}
188183

189184
/**

0 commit comments

Comments
 (0)