mirror of
				https://github.com/esphome/esphome.git
				synced 2025-10-31 07:03:55 +00:00 
			
		
		
		
	[wifi] Fix crash during WiFi reconnection on ESP32 with poor signal quality (#9989)
This commit is contained in:
		| @@ -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; | ||||||
|   | |||||||
| @@ -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; | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user