[wifi] Fix crash during WiFi reconnection on ESP32 with poor signal quality (#9989)

This commit is contained in:
J. Nick Koston 2025-07-31 21:46:52 -10:00 committed by GitHub
parent 940a8b43fa
commit 20ad1ab4eb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 36 additions and 0 deletions

View File

@ -283,6 +283,12 @@ bool WiFiComponent::wifi_sta_ip_config_(optional<ManualIP> manual_ip) {
if (!this->wifi_mode_(true, {})) if (!this->wifi_mode_(true, {}))
return false; return false;
// Check if the STA interface is initialized before using it
if (s_sta_netif == nullptr) {
ESP_LOGW(TAG, "STA interface not initialized");
return false;
}
esp_netif_dhcp_status_t dhcp_status; esp_netif_dhcp_status_t dhcp_status;
esp_err_t err = esp_netif_dhcpc_get_status(s_sta_netif, &dhcp_status); esp_err_t err = esp_netif_dhcpc_get_status(s_sta_netif, &dhcp_status);
if (err != ESP_OK) { if (err != ESP_OK) {
@ -541,6 +547,8 @@ void WiFiComponent::wifi_event_callback_(esphome_wifi_event_id_t event, esphome_
} }
case ESPHOME_EVENT_ID_WIFI_STA_STOP: { case ESPHOME_EVENT_ID_WIFI_STA_STOP: {
ESP_LOGV(TAG, "STA stop"); ESP_LOGV(TAG, "STA stop");
// Clear the STA interface handle to prevent use-after-free
s_sta_netif = nullptr;
break; break;
} }
case ESPHOME_EVENT_ID_WIFI_STA_CONNECTED: { case ESPHOME_EVENT_ID_WIFI_STA_CONNECTED: {
@ -630,6 +638,10 @@ void WiFiComponent::wifi_event_callback_(esphome_wifi_event_id_t event, esphome_
} }
case ESPHOME_EVENT_ID_WIFI_AP_STOP: { case ESPHOME_EVENT_ID_WIFI_AP_STOP: {
ESP_LOGV(TAG, "AP stop"); ESP_LOGV(TAG, "AP stop");
#ifdef USE_WIFI_AP
// Clear the AP interface handle to prevent use-after-free
s_ap_netif = nullptr;
#endif
break; break;
} }
case ESPHOME_EVENT_ID_WIFI_AP_STACONNECTED: { case ESPHOME_EVENT_ID_WIFI_AP_STACONNECTED: {
@ -719,6 +731,12 @@ bool WiFiComponent::wifi_ap_ip_config_(optional<ManualIP> manual_ip) {
if (!this->wifi_mode_({}, true)) if (!this->wifi_mode_({}, true))
return false; return false;
// Check if the AP interface is initialized before using it
if (s_ap_netif == nullptr) {
ESP_LOGW(TAG, "AP interface not initialized");
return false;
}
esp_netif_ip_info_t info; esp_netif_ip_info_t info;
if (manual_ip.has_value()) { if (manual_ip.has_value()) {
info.ip = manual_ip->static_ip; info.ip = manual_ip->static_ip;

View File

@ -473,6 +473,12 @@ bool WiFiComponent::wifi_sta_ip_config_(optional<ManualIP> manual_ip) {
if (!this->wifi_mode_(true, {})) if (!this->wifi_mode_(true, {}))
return false; return false;
// Check if the STA interface is initialized before using it
if (s_sta_netif == nullptr) {
ESP_LOGW(TAG, "STA interface not initialized");
return false;
}
esp_netif_dhcp_status_t dhcp_status; esp_netif_dhcp_status_t dhcp_status;
esp_err_t err = esp_netif_dhcpc_get_status(s_sta_netif, &dhcp_status); esp_err_t err = esp_netif_dhcpc_get_status(s_sta_netif, &dhcp_status);
if (err != ESP_OK) { if (err != ESP_OK) {
@ -691,6 +697,8 @@ void WiFiComponent::wifi_process_event_(IDFWiFiEvent *data) {
} else if (data->event_base == WIFI_EVENT && data->event_id == WIFI_EVENT_STA_STOP) { } else if (data->event_base == WIFI_EVENT && data->event_id == WIFI_EVENT_STA_STOP) {
ESP_LOGV(TAG, "STA stop"); ESP_LOGV(TAG, "STA stop");
s_sta_started = false; s_sta_started = false;
// Clear the STA interface handle to prevent use-after-free
s_sta_netif = nullptr;
} else if (data->event_base == WIFI_EVENT && data->event_id == WIFI_EVENT_STA_AUTHMODE_CHANGE) { } else if (data->event_base == WIFI_EVENT && data->event_id == WIFI_EVENT_STA_AUTHMODE_CHANGE) {
const auto &it = data->data.sta_authmode_change; const auto &it = data->data.sta_authmode_change;
@ -789,6 +797,10 @@ void WiFiComponent::wifi_process_event_(IDFWiFiEvent *data) {
} else if (data->event_base == WIFI_EVENT && data->event_id == WIFI_EVENT_AP_STOP) { } else if (data->event_base == WIFI_EVENT && data->event_id == WIFI_EVENT_AP_STOP) {
ESP_LOGV(TAG, "AP stop"); ESP_LOGV(TAG, "AP stop");
s_ap_started = false; s_ap_started = false;
#ifdef USE_WIFI_AP
// Clear the AP interface handle to prevent use-after-free
s_ap_netif = nullptr;
#endif
} else if (data->event_base == WIFI_EVENT && data->event_id == WIFI_EVENT_AP_PROBEREQRECVED) { } else if (data->event_base == WIFI_EVENT && data->event_id == WIFI_EVENT_AP_PROBEREQRECVED) {
const auto &it = data->data.ap_probe_req_rx; const auto &it = data->data.ap_probe_req_rx;
@ -865,6 +877,12 @@ bool WiFiComponent::wifi_ap_ip_config_(optional<ManualIP> manual_ip) {
if (!this->wifi_mode_({}, true)) if (!this->wifi_mode_({}, true))
return false; return false;
// Check if the AP interface is initialized before using it
if (s_ap_netif == nullptr) {
ESP_LOGW(TAG, "AP interface not initialized");
return false;
}
esp_netif_ip_info_t info; esp_netif_ip_info_t info;
if (manual_ip.has_value()) { if (manual_ip.has_value()) {
info.ip = manual_ip->static_ip; info.ip = manual_ip->static_ip;