From dd25e2b9d6ccab0bf7a91fab5693c8f340f72601 Mon Sep 17 00:00:00 2001 From: Me No Dev Date: Fri, 16 Jul 2021 14:48:57 +0300 Subject: [PATCH] Fix some WiFi issues (#5395) * Add back ARDUINO_EVENT_WIFI_READY Fixes: https://github.com/espressif/arduino-esp32/issues/5315 * use strncpy and strncmp for WiFi SSID and Password in AP and STA Fixes: https://github.com/espressif/arduino-esp32/issues/5367 * Implement timeout for waitForConnectResult Fixes: https://github.com/espressif/arduino-esp32/issues/5330 * Remove old definition of "reverse" from stdlib_noniso Fixes: https://github.com/espressif/arduino-esp32/issues/5045 * Make "reverse" noniso conditional on ESP_DSP --- cores/esp32/stdlib_noniso.c | 5 +++++ libraries/WiFi/src/WiFiAP.cpp | 8 ++++---- libraries/WiFi/src/WiFiGeneric.cpp | 5 +++++ libraries/WiFi/src/WiFiSTA.cpp | 22 +++++++--------------- libraries/WiFi/src/WiFiSTA.h | 2 +- 5 files changed, 22 insertions(+), 20 deletions(-) diff --git a/cores/esp32/stdlib_noniso.c b/cores/esp32/stdlib_noniso.c index e79204890..e68c92d05 100644 --- a/cores/esp32/stdlib_noniso.c +++ b/cores/esp32/stdlib_noniso.c @@ -28,7 +28,9 @@ #include #include #include "stdlib_noniso.h" +#include "esp_system.h" +#if !CONFIG_DSP_ANSI && !CONFIG_DSP_OPTIMIZED void reverse(char* begin, char* end) { char *is = begin; char *ie = end - 1; @@ -40,6 +42,9 @@ void reverse(char* begin, char* end) { --ie; } } +#else +void reverse(char* begin, char* end); +#endif char* ltoa(long value, char* result, int base) { if(base < 2 || base > 16) { diff --git a/libraries/WiFi/src/WiFiAP.cpp b/libraries/WiFi/src/WiFiAP.cpp index c008cfcbd..5bdf13a9d 100644 --- a/libraries/WiFi/src/WiFiAP.cpp +++ b/libraries/WiFi/src/WiFiAP.cpp @@ -60,10 +60,10 @@ static bool softap_config_equal(const wifi_config_t& lhs, const wifi_config_t& r */ static bool softap_config_equal(const wifi_config_t& lhs, const wifi_config_t& rhs) { - if(strcmp(reinterpret_cast(lhs.ap.ssid), reinterpret_cast(rhs.ap.ssid)) != 0) { + if(strncmp(reinterpret_cast(lhs.ap.ssid), reinterpret_cast(rhs.ap.ssid), 32) != 0) { return false; } - if(strcmp(reinterpret_cast(lhs.ap.password), reinterpret_cast(rhs.ap.password)) != 0) { + if(strncmp(reinterpret_cast(lhs.ap.password), reinterpret_cast(rhs.ap.password), 64) != 0) { return false; } if(lhs.ap.channel != rhs.ap.channel) { @@ -98,12 +98,12 @@ void wifi_softap_config(wifi_config_t *wifi_config, const char * ssid=NULL, cons wifi_config->ap.password[0] = 0; wifi_config->ap.ftm_responder = ftm_responder; if(ssid != NULL && ssid[0] != 0){ - snprintf((char*)wifi_config->ap.ssid, 32, ssid); + strncpy((char*)wifi_config->ap.ssid, ssid, 32); wifi_config->ap.ssid_len = strlen(ssid); if(password != NULL && password[0] != 0){ wifi_config->ap.authmode = authmode; wifi_config->ap.pairwise_cipher = WIFI_CIPHER_TYPE_CCMP; // Disable by default enabled insecure TKIP and use just CCMP. - snprintf((char*)wifi_config->ap.password, 64, password); + strncpy((char*)wifi_config->ap.password, password, 64); } } } diff --git a/libraries/WiFi/src/WiFiGeneric.cpp b/libraries/WiFi/src/WiFiGeneric.cpp index 42c9d2567..1ec6cf260 100644 --- a/libraries/WiFi/src/WiFiGeneric.cpp +++ b/libraries/WiFi/src/WiFiGeneric.cpp @@ -567,6 +567,11 @@ bool wifiLowLevelInit(bool persistent){ if(!persistent){ lowLevelInitDone = esp_wifi_set_storage(WIFI_STORAGE_RAM) == ESP_OK; } + if(lowLevelInitDone){ + arduino_event_t arduino_event; + arduino_event.event_id = ARDUINO_EVENT_WIFI_READY; + postArduinoEvent(&arduino_event); + } } return lowLevelInitDone; } diff --git a/libraries/WiFi/src/WiFiSTA.cpp b/libraries/WiFi/src/WiFiSTA.cpp index 9d14ce58a..7a51b3a31 100644 --- a/libraries/WiFi/src/WiFiSTA.cpp +++ b/libraries/WiFi/src/WiFiSTA.cpp @@ -82,14 +82,10 @@ static void wifi_sta_config(wifi_config_t * wifi_config, const char * ssid=NULL, wifi_config->sta.ssid[0] = 0; wifi_config->sta.password[0] = 0; if(ssid != NULL && ssid[0] != 0){ - snprintf((char*)wifi_config->sta.ssid, 32, ssid); + strncpy((char*)wifi_config->sta.ssid, ssid, 32); if(password != NULL && password[0] != 0){ wifi_config->sta.threshold.authmode = WIFI_AUTH_WEP; - if(strlen(password) == 64){ - memcpy((char*)wifi_config->sta.password, password, 64); - } else { - snprintf((char*)wifi_config->sta.password, 64, password); - } + strncpy((char*)wifi_config->sta.password, password, 64); } if(bssid != NULL){ wifi_config->sta.bssid_set = 1; @@ -165,15 +161,11 @@ wl_status_t WiFiSTAClass::begin(const char* ssid, const char *passphrase, int32_ wifi_config_t conf; memset(&conf, 0, sizeof(wifi_config_t)); - strcpy(reinterpret_cast(conf.sta.ssid), ssid); + strncpy(reinterpret_cast(conf.sta.ssid), ssid, 32); conf.sta.scan_method = WIFI_ALL_CHANNEL_SCAN; //force full scan to be able to choose the nearest / strongest AP if(passphrase) { - if (strlen(passphrase) == 64){ // it's not a passphrase, is the PSK - memcpy(reinterpret_cast(conf.sta.password), passphrase, 64); - } else { - strcpy(reinterpret_cast(conf.sta.password), passphrase); - } + strncpy(reinterpret_cast(conf.sta.password), passphrase, 64); } wifi_config_t current_conf; @@ -370,14 +362,14 @@ bool WiFiSTAClass::getAutoReconnect() * returns the status reached or disconnect if STA is off * @return wl_status_t */ -uint8_t WiFiSTAClass::waitForConnectResult() +uint8_t WiFiSTAClass::waitForConnectResult(unsigned long timeoutLength) { //1 and 3 have STA enabled if((WiFiGenericClass::getMode() & WIFI_MODE_STA) == 0) { return WL_DISCONNECTED; } - int i = 0; - while((!status() || status() >= WL_DISCONNECTED) && i++ < 100) { + unsigned long start = millis(); + while((!status() || status() >= WL_DISCONNECTED) && (millis() - start) < timeoutLength) { delay(100); } return status(); diff --git a/libraries/WiFi/src/WiFiSTA.h b/libraries/WiFi/src/WiFiSTA.h index 3efff4267..afd641f7e 100644 --- a/libraries/WiFi/src/WiFiSTA.h +++ b/libraries/WiFi/src/WiFiSTA.h @@ -56,7 +56,7 @@ public: bool setAutoReconnect(bool autoReconnect); bool getAutoReconnect(); - uint8_t waitForConnectResult(); + uint8_t waitForConnectResult(unsigned long timeoutLength = 60000); // STA network info IPAddress localIP(); -- GitLab