Skip to content

Commit a65a034

Browse files
CrashFix WiFiGeneric
Fixes crash in WiFiGeneric due to bad index into system_event_reasons[]. Also replaced arduino_event_names[] to prevent a potential crash. Supports multiple Arduino versions.
1 parent 4cb596a commit a65a034

File tree

2 files changed

+170
-23
lines changed

2 files changed

+170
-23
lines changed

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

+167-23
Original file line numberDiff line numberDiff line change
@@ -764,6 +764,169 @@ wifi_ps_type_t WiFiGenericClass::_sleepEnabled = WIFI_PS_NONE;
764764
wifi_ps_type_t WiFiGenericClass::_sleepEnabled = WIFI_PS_MIN_MODEM;
765765
#endif
766766

767+
//---C function prototypes---
768+
const char * ArduinoEventIdToCStr(arduino_event_id_t id);
769+
const char * WiFiErrReasonToCStr(wifi_err_reason_t reason);
770+
//---C function prototypes---
771+
772+
/**
773+
* @brief Convert arduino_event_id_t to a string.
774+
* @param [in] id The event id to be converted.
775+
* @return A string representation of the event id.
776+
* @note: arduino_event_id_t values as of Mar 2023 (arduino-esp32 r2.0.7) are: 0-39 (ARDUINO_EVENT_MAX=40) and are defined in WiFiGeneric.h.
777+
*/
778+
const char * ArduinoEventIdToCStr(arduino_event_id_t id) {
779+
switch(id) {
780+
case ARDUINO_EVENT_WIFI_READY: return "WIFI_READY";
781+
case ARDUINO_EVENT_WIFI_SCAN_DONE: return "SCAN_DONE";
782+
case ARDUINO_EVENT_WIFI_STA_START: return "STA_START";
783+
case ARDUINO_EVENT_WIFI_STA_STOP: return "STA_STOP";
784+
case ARDUINO_EVENT_WIFI_STA_CONNECTED: return "STA_CONNECTED";
785+
case ARDUINO_EVENT_WIFI_STA_DISCONNECTED: return "STA_DISCONNECTED";
786+
case ARDUINO_EVENT_WIFI_STA_AUTHMODE_CHANGE: return "STA_AUTHMODE_CHANGE";
787+
case ARDUINO_EVENT_WIFI_STA_GOT_IP: return "STA_GOT_IP";
788+
case ARDUINO_EVENT_WIFI_STA_GOT_IP6: return "STA_GOT_IP6";
789+
case ARDUINO_EVENT_WIFI_STA_LOST_IP: return "STA_LOST_IP";
790+
case ARDUINO_EVENT_WIFI_AP_START: return "AP_START";
791+
case ARDUINO_EVENT_WIFI_AP_STOP: return "AP_STOP";
792+
case ARDUINO_EVENT_WIFI_AP_STACONNECTED: return "AP_STACONNECTED";
793+
case ARDUINO_EVENT_WIFI_AP_STADISCONNECTED: return "AP_STADISCONNECTED";
794+
case ARDUINO_EVENT_WIFI_AP_STAIPASSIGNED: return "AP_STAIPASSIGNED";
795+
case ARDUINO_EVENT_WIFI_AP_PROBEREQRECVED: return "AP_PROBEREQRECVED";
796+
case ARDUINO_EVENT_WIFI_AP_GOT_IP6: return "AP_GOT_IP6";
797+
case ARDUINO_EVENT_WIFI_FTM_REPORT: return "FTM_REPORT";
798+
case ARDUINO_EVENT_ETH_START: return "ETH_START";
799+
case ARDUINO_EVENT_ETH_STOP: return "ETH_STOP";
800+
case ARDUINO_EVENT_ETH_CONNECTED: return "ETH_CONNECTED";
801+
case ARDUINO_EVENT_ETH_DISCONNECTED: return "ETH_DISCONNECTED";
802+
case ARDUINO_EVENT_ETH_GOT_IP: return "ETH_GOT_IP";
803+
case ARDUINO_EVENT_ETH_GOT_IP6: return "ETH_GOT_IP6";
804+
case ARDUINO_EVENT_WPS_ER_SUCCESS: return "WPS_ER_SUCCESS";
805+
case ARDUINO_EVENT_WPS_ER_FAILED: return "WPS_ER_FAILED";
806+
case ARDUINO_EVENT_WPS_ER_TIMEOUT: return "WPS_ER_TIMEOUT";
807+
case ARDUINO_EVENT_WPS_ER_PIN: return "WPS_ER_PIN";
808+
case ARDUINO_EVENT_WPS_ER_PBC_OVERLAP: return "WPS_ER_PBC_OVERLAP";
809+
case ARDUINO_EVENT_SC_SCAN_DONE: return "SC_SCAN_DONE";
810+
case ARDUINO_EVENT_SC_FOUND_CHANNEL: return "SC_FOUND_CHANNEL";
811+
case ARDUINO_EVENT_SC_GOT_SSID_PSWD: return "SC_GOT_SSID_PSWD";
812+
case ARDUINO_EVENT_SC_SEND_ACK_DONE: return "SC_SEND_ACK_DONE";
813+
case ARDUINO_EVENT_PROV_INIT: return "PROV_INIT";
814+
case ARDUINO_EVENT_PROV_DEINIT: return "PROV_DEINIT";
815+
case ARDUINO_EVENT_PROV_START: return "PROV_START";
816+
case ARDUINO_EVENT_PROV_END: return "PROV_END";
817+
case ARDUINO_EVENT_PROV_CRED_RECV: return "PROV_CRED_RECV";
818+
case ARDUINO_EVENT_PROV_CRED_FAIL: return "PROV_CRED_FAIL";
819+
case ARDUINO_EVENT_PROV_CRED_SUCCESS: return "PROV_CRED_SUCCESS";
820+
default: return "";
821+
}
822+
}
823+
824+
/**
825+
* @brief Convert wifi_err_reason_t to a string.
826+
* @param [in] reason The reason to be converted.
827+
* @return A string representation of the error code.
828+
* @note: wifi_err_reason_t values as of Mar 2023 (arduino-esp32 r2.0.7) are: (1-39, 46-51, 67-68, 200-208) and are defined in /tools/sdk/esp32/include/esp_wifi/include/esp_wifi_types.h.
829+
*/
830+
const char * WiFiErrReasonToCStr(wifi_err_reason_t reason) {
831+
switch(reason) {
832+
#if ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(2,0,3) && ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,6)
833+
case WIFI_REASON_UNSPECIFIED: return "UNSPECIFIED";
834+
case WIFI_REASON_AUTH_EXPIRE: return "AUTH_EXPIRE";
835+
case WIFI_REASON_AUTH_LEAVE: return "AUTH_LEAVE";
836+
case WIFI_REASON_ASSOC_EXPIRE: return "ASSOC_EXPIRE";
837+
case WIFI_REASON_ASSOC_TOOMANY: return "ASSOC_TOOMANY";
838+
case WIFI_REASON_NOT_AUTHED: return "NOT_AUTHED";
839+
case WIFI_REASON_NOT_ASSOCED: return "NOT_ASSOCED";
840+
case WIFI_REASON_ASSOC_LEAVE: return "ASSOC_LEAVE";
841+
case WIFI_REASON_ASSOC_NOT_AUTHED: return "ASSOC_NOT_AUTHED";
842+
case WIFI_REASON_DISASSOC_PWRCAP_BAD: return "DISASSOC_PWRCAP_BAD";
843+
case WIFI_REASON_DISASSOC_SUPCHAN_BAD: return "DISASSOC_SUPCHAN_BAD";
844+
case WIFI_REASON_BSS_TRANSITION_DISASSOC: return "BSS_TRANSITION_DISASSOC";
845+
case WIFI_REASON_IE_INVALID: return "IE_INVALID";
846+
case WIFI_REASON_MIC_FAILURE: return "MIC_FAILURE";
847+
case WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT: return "4WAY_HANDSHAKE_TIMEOUT";
848+
case WIFI_REASON_GROUP_KEY_UPDATE_TIMEOUT: return "GROUP_KEY_UPDATE_TIMEOUT";
849+
case WIFI_REASON_IE_IN_4WAY_DIFFERS: return "IE_IN_4WAY_DIFFERS";
850+
case WIFI_REASON_GROUP_CIPHER_INVALID: return "GROUP_CIPHER_INVALID";
851+
case WIFI_REASON_PAIRWISE_CIPHER_INVALID: return "PAIRWISE_CIPHER_INVALID";
852+
case WIFI_REASON_AKMP_INVALID: return "AKMP_INVALID";
853+
case WIFI_REASON_UNSUPP_RSN_IE_VERSION: return "UNSUPP_RSN_IE_VERSION";
854+
case WIFI_REASON_INVALID_RSN_IE_CAP: return "INVALID_RSN_IE_CAP";
855+
case WIFI_REASON_802_1X_AUTH_FAILED: return "802_1X_AUTH_FAILED";
856+
case WIFI_REASON_CIPHER_SUITE_REJECTED: return "CIPHER_SUITE_REJECTED";
857+
858+
case WIFI_REASON_INVALID_PMKID: return "INVALID_PMKID";
859+
860+
case WIFI_REASON_BEACON_TIMEOUT: return "BEACON_TIMEOUT";
861+
case WIFI_REASON_NO_AP_FOUND: return "NO_AP_FOUND";
862+
case WIFI_REASON_AUTH_FAIL: return "AUTH_FAIL";
863+
case WIFI_REASON_ASSOC_FAIL: return "ASSOC_FAIL";
864+
case WIFI_REASON_HANDSHAKE_TIMEOUT: return "HANDSHAKE_TIMEOUT";
865+
case WIFI_REASON_CONNECTION_FAIL: return "CONNECTION_FAIL";
866+
case WIFI_REASON_AP_TSF_RESET: return "AP_TSF_RESET";
867+
case WIFI_REASON_ROAMING: return "ROAMING";
868+
#elif ESP_ARDUINO_VERSION >= ESP_ARDUINO_VERSION_VAL(2,0,7) && ESP_ARDUINO_VERSION <= ESP_ARDUINO_VERSION_VAL(2,0,8)
869+
case WIFI_REASON_UNSPECIFIED: return "UNSPECIFIED";
870+
case WIFI_REASON_AUTH_EXPIRE: return "AUTH_EXPIRE";
871+
case WIFI_REASON_AUTH_LEAVE: return "AUTH_LEAVE";
872+
case WIFI_REASON_ASSOC_EXPIRE: return "ASSOC_EXPIRE";
873+
case WIFI_REASON_ASSOC_TOOMANY: return "ASSOC_TOOMANY";
874+
case WIFI_REASON_NOT_AUTHED: return "NOT_AUTHED";
875+
case WIFI_REASON_NOT_ASSOCED: return "NOT_ASSOCED";
876+
case WIFI_REASON_ASSOC_LEAVE: return "ASSOC_LEAVE";
877+
case WIFI_REASON_ASSOC_NOT_AUTHED: return "ASSOC_NOT_AUTHED";
878+
case WIFI_REASON_DISASSOC_PWRCAP_BAD: return "DISASSOC_PWRCAP_BAD";
879+
case WIFI_REASON_DISASSOC_SUPCHAN_BAD: return "DISASSOC_SUPCHAN_BAD";
880+
case WIFI_REASON_BSS_TRANSITION_DISASSOC: return "BSS_TRANSITION_DISASSOC";
881+
case WIFI_REASON_IE_INVALID: return "IE_INVALID";
882+
case WIFI_REASON_MIC_FAILURE: return "MIC_FAILURE";
883+
case WIFI_REASON_4WAY_HANDSHAKE_TIMEOUT: return "4WAY_HANDSHAKE_TIMEOUT";
884+
case WIFI_REASON_GROUP_KEY_UPDATE_TIMEOUT: return "GROUP_KEY_UPDATE_TIMEOUT";
885+
case WIFI_REASON_IE_IN_4WAY_DIFFERS: return "IE_IN_4WAY_DIFFERS";
886+
case WIFI_REASON_GROUP_CIPHER_INVALID: return "GROUP_CIPHER_INVALID";
887+
case WIFI_REASON_PAIRWISE_CIPHER_INVALID: return "PAIRWISE_CIPHER_INVALID";
888+
case WIFI_REASON_AKMP_INVALID: return "AKMP_INVALID";
889+
case WIFI_REASON_UNSUPP_RSN_IE_VERSION: return "UNSUPP_RSN_IE_VERSION";
890+
case WIFI_REASON_INVALID_RSN_IE_CAP: return "INVALID_RSN_IE_CAP";
891+
case WIFI_REASON_802_1X_AUTH_FAILED: return "802_1X_AUTH_FAILED";
892+
case WIFI_REASON_CIPHER_SUITE_REJECTED: return "CIPHER_SUITE_REJECTED";
893+
case WIFI_REASON_TDLS_PEER_UNREACHABLE: return "TDLS_PEER_UNREACHABLE";
894+
case WIFI_REASON_TDLS_UNSPECIFIED: return "TDLS_UNSPECIFIED";
895+
case WIFI_REASON_SSP_REQUESTED_DISASSOC: return "SSP_REQUESTED_DISASSOC";
896+
case WIFI_REASON_NO_SSP_ROAMING_AGREEMENT: return "NO_SSP_ROAMING_AGREEMENT";
897+
case WIFI_REASON_BAD_CIPHER_OR_AKM: return "BAD_CIPHER_OR_AKM";
898+
case WIFI_REASON_NOT_AUTHORIZED_THIS_LOCATION: return "NOT_AUTHORIZED_THIS_LOCATION";
899+
case WIFI_REASON_SERVICE_CHANGE_PERCLUDES_TS: return "SERVICE_CHANGE_PERCLUDES_TS";
900+
case WIFI_REASON_UNSPECIFIED_QOS: return "UNSPECIFIED_QOS";
901+
case WIFI_REASON_NOT_ENOUGH_BANDWIDTH: return "NOT_ENOUGH_BANDWIDTH";
902+
case WIFI_REASON_MISSING_ACKS: return "MISSING_ACKS";
903+
case WIFI_REASON_EXCEEDED_TXOP: return "EXCEEDED_TXOP";
904+
case WIFI_REASON_STA_LEAVING: return "STA_LEAVING";
905+
case WIFI_REASON_END_BA: return "END_BA";
906+
case WIFI_REASON_UNKNOWN_BA: return "UNKNOWN_BA";
907+
case WIFI_REASON_TIMEOUT: return "TIMEOUT";
908+
case WIFI_REASON_PEER_INITIATED: return "PEER_INITIATED";
909+
case WIFI_REASON_AP_INITIATED: return "AP_INITIATED";
910+
case WIFI_REASON_INVALID_FT_ACTION_FRAME_COUNT: return "INVALID_FT_ACTION_FRAME_COUNT";
911+
case WIFI_REASON_INVALID_PMKID: return "INVALID_PMKID";
912+
case WIFI_REASON_INVALID_MDE: return "INVALID_MDE";
913+
case WIFI_REASON_INVALID_FTE: return "INVALID_FTE";
914+
case WIFI_REASON_TRANSMISSION_LINK_ESTABLISH_FAILED: return "TRANSMISSION_LINK_ESTABLISH_FAILED";
915+
case WIFI_REASON_ALTERATIVE_CHANNEL_OCCUPIED: return "ALTERATIVE_CHANNEL_OCCUPIED";
916+
case WIFI_REASON_BEACON_TIMEOUT: return "BEACON_TIMEOUT";
917+
case WIFI_REASON_NO_AP_FOUND: return "NO_AP_FOUND";
918+
case WIFI_REASON_AUTH_FAIL: return "AUTH_FAIL";
919+
case WIFI_REASON_ASSOC_FAIL: return "ASSOC_FAIL";
920+
case WIFI_REASON_HANDSHAKE_TIMEOUT: return "HANDSHAKE_TIMEOUT";
921+
case WIFI_REASON_CONNECTION_FAIL: return "CONNECTION_FAIL";
922+
case WIFI_REASON_AP_TSF_RESET: return "AP_TSF_RESET";
923+
case WIFI_REASON_ROAMING: return "ROAMING";
924+
case WIFI_REASON_ASSOC_COMEBACK_TIME_TOO_LONG: return "ASSOC_COMEBACK_TIME_TOO_LONG";
925+
#endif
926+
default: return "";
927+
}
928+
}
929+
767930
WiFiGenericClass::WiFiGenericClass()
768931
{
769932
}
@@ -906,33 +1069,15 @@ void WiFiGenericClass::removeEvent(wifi_event_id_t id)
9061069
* callback for WiFi events
9071070
* @param arg
9081071
*/
909-
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_DEBUG
910-
const char * arduino_event_names[] = {
911-
"WIFI_READY",
912-
"SCAN_DONE",
913-
"STA_START", "STA_STOP", "STA_CONNECTED", "STA_DISCONNECTED", "STA_AUTHMODE_CHANGE", "STA_GOT_IP", "STA_GOT_IP6", "STA_LOST_IP",
914-
"AP_START", "AP_STOP", "AP_STACONNECTED", "AP_STADISCONNECTED", "AP_STAIPASSIGNED", "AP_PROBEREQRECVED", "AP_GOT_IP6",
915-
"FTM_REPORT",
916-
"ETH_START", "ETH_STOP", "ETH_CONNECTED", "ETH_DISCONNECTED", "ETH_GOT_IP", "ETH_GOT_IP6",
917-
"WPS_ER_SUCCESS", "WPS_ER_FAILED", "WPS_ER_TIMEOUT", "WPS_ER_PIN", "WPS_ER_PBC_OVERLAP",
918-
"SC_SCAN_DONE", "SC_FOUND_CHANNEL", "SC_GOT_SSID_PSWD", "SC_SEND_ACK_DONE",
919-
"PROV_INIT", "PROV_DEINIT", "PROV_START", "PROV_END", "PROV_CRED_RECV", "PROV_CRED_FAIL", "PROV_CRED_SUCCESS"
920-
};
921-
#endif
922-
#if ARDUHAL_LOG_LEVEL >= ARDUHAL_LOG_LEVEL_WARN
923-
const char * system_event_reasons[] = { "UNSPECIFIED", "AUTH_EXPIRE", "AUTH_LEAVE", "ASSOC_EXPIRE", "ASSOC_TOOMANY", "NOT_AUTHED", "NOT_ASSOCED", "ASSOC_LEAVE", "ASSOC_NOT_AUTHED", "DISASSOC_PWRCAP_BAD", "DISASSOC_SUPCHAN_BAD", "UNSPECIFIED", "IE_INVALID", "MIC_FAILURE", "4WAY_HANDSHAKE_TIMEOUT", "GROUP_KEY_UPDATE_TIMEOUT", "IE_IN_4WAY_DIFFERS", "GROUP_CIPHER_INVALID", "PAIRWISE_CIPHER_INVALID", "AKMP_INVALID", "UNSUPP_RSN_IE_VERSION", "INVALID_RSN_IE_CAP", "802_1X_AUTH_FAILED", "CIPHER_SUITE_REJECTED", "BEACON_TIMEOUT", "NO_AP_FOUND", "AUTH_FAIL", "ASSOC_FAIL", "HANDSHAKE_TIMEOUT", "CONNECTION_FAIL" };
924-
#define reason2str(r) ((r>176)?system_event_reasons[r-176]:system_event_reasons[r-1])
925-
#endif
9261072
esp_err_t WiFiGenericClass::_eventCallback(arduino_event_t *event)
9271073
{
9281074
static bool first_connect = true;
9291075

930-
if(event->event_id < ARDUINO_EVENT_MAX) {
931-
log_d("Arduino Event: %d - %s", event->event_id, arduino_event_names[event->event_id]);
932-
}
1076+
if(!event) return ESP_OK; //Null would crash this function
1077+
1078+
log_d("Arduino Event: %d - %s", event->event_id, ArduinoEventIdToCStr(event->event_id));
9331079
if(event->event_id == ARDUINO_EVENT_WIFI_SCAN_DONE) {
9341080
WiFiScanClass::_scanDone();
935-
9361081
} else if(event->event_id == ARDUINO_EVENT_WIFI_STA_START) {
9371082
WiFiSTAClass::_setStatus(WL_DISCONNECTED);
9381083
setStatusBits(STA_STARTED_BIT);
@@ -945,14 +1090,13 @@ esp_err_t WiFiGenericClass::_eventCallback(arduino_event_t *event)
9451090
} else if(event->event_id == ARDUINO_EVENT_WIFI_STA_CONNECTED) {
9461091
WiFiSTAClass::_setStatus(WL_IDLE_STATUS);
9471092
setStatusBits(STA_CONNECTED_BIT);
948-
9491093
//esp_netif_create_ip6_linklocal(esp_netifs[ESP_IF_WIFI_STA]);
9501094
} else if(event->event_id == ARDUINO_EVENT_WIFI_STA_DISCONNECTED) {
9511095
uint8_t reason = event->event_info.wifi_sta_disconnected.reason;
9521096
// Reason 0 causes crash, use reason 1 (UNSPECIFIED) instead
9531097
if(!reason)
9541098
reason = WIFI_REASON_UNSPECIFIED;
955-
log_w("Reason: %u - %s", reason, reason2str(reason));
1099+
log_w("Reason: %u - %s", reason, WiFiErrReasonToCStr((wifi_err_reason_t)reason));
9561100
if(reason == WIFI_REASON_NO_AP_FOUND) {
9571101
WiFiSTAClass::_setStatus(WL_NO_SSID_AVAIL);
9581102
} else if((reason == WIFI_REASON_AUTH_FAIL) && !first_connect){

Diff for: libraries/WiFi/src/WiFiGeneric.h

+3
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,9 @@ typedef enum {
151151
WIFI_TX_ANT_AUTO
152152
} wifi_tx_ant_t;
153153

154+
extern const char * ArduinoEventIdToCStr(arduino_event_id_t id);
155+
extern const char * WiFiErrReasonToCStr(wifi_err_reason_t reason);
156+
154157
class WiFiGenericClass
155158
{
156159
public:

0 commit comments

Comments
 (0)