fix(sta2eth): Check for null `netif` before starting/stopping DHCP server

Fixes a potential null pointer dereference in `esp_netif` when PPP mode is enabled.
In the Ethernet event handler, `esp_netif_dhcps_start()` and `esp_netif_dhcps_stop()`
are now only called if `netif` is non-null (in provisioning mode when
the actual TCP/IP stack from IDF is used, in work mode the `netif` is
null, since the trafic is simply forwarded between wireless and wired
networks without TCP/IP stack involved)

Closes https://github.com/espressif/esp-idf/issues/14816
pull/14315/merge
David Cermak 2024-11-07 10:38:48 +01:00
rodzic 94536cb512
commit cce9a80aee
1 zmienionych plików z 9 dodań i 3 usunięć

Wyświetl plik

@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2023 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2023-2024 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Unlicense OR CC0-1.0 * SPDX-License-Identifier: Unlicense OR CC0-1.0
*/ */
@ -49,7 +49,11 @@ void eth_event_handler(void *arg, esp_event_base_t event_base,
switch (event_id) { switch (event_id) {
case ETHERNET_EVENT_CONNECTED: case ETHERNET_EVENT_CONNECTED:
ESP_LOGI(TAG, "Ethernet Link Up"); ESP_LOGI(TAG, "Ethernet Link Up");
esp_netif_dhcps_start(netif); if (netif) {
// Start DHCP server only if we "have" the actual netif (provisioning mode)
// (if netif==NULL we are only forwarding frames, no lwip involved)
esp_netif_dhcps_start(netif);
}
esp_eth_ioctl(eth_handle, ETH_CMD_G_MAC_ADDR, mac_addr); esp_eth_ioctl(eth_handle, ETH_CMD_G_MAC_ADDR, mac_addr);
ESP_LOGI(TAG, "Ethernet HW Addr %02x:%02x:%02x:%02x:%02x:%02x", ESP_LOGI(TAG, "Ethernet HW Addr %02x:%02x:%02x:%02x:%02x:%02x",
mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]); mac_addr[0], mac_addr[1], mac_addr[2], mac_addr[3], mac_addr[4], mac_addr[5]);
@ -57,7 +61,9 @@ void eth_event_handler(void *arg, esp_event_base_t event_base,
break; break;
case ETHERNET_EVENT_DISCONNECTED: case ETHERNET_EVENT_DISCONNECTED:
ESP_LOGI(TAG, "Ethernet Link Down"); ESP_LOGI(TAG, "Ethernet Link Down");
esp_netif_dhcps_stop(netif); if (netif) {
esp_netif_dhcps_stop(netif);
}
s_ethernet_is_connected = false; s_ethernet_is_connected = false;
break; break;
case ETHERNET_EVENT_START: case ETHERNET_EVENT_START: