From 097282a8e3f85958747430d9931ce0a545d37700 Mon Sep 17 00:00:00 2001 From: David Cermak Date: Mon, 22 Oct 2018 16:45:42 +0200 Subject: [PATCH] mdns: fixed crashes on network changes 1) two events AP_STOP, AP_START shortly after each other may cause IGMP config on already stopped netif 2) not properly locked sending packets to queue from timer task closes #2580 --- components/mdns/mdns.c | 3 ++- components/mdns/mdns_networking.c | 6 ++++++ components/tcpip_adapter/include/tcpip_adapter.h | 10 ++++++++++ components/tcpip_adapter/tcpip_adapter_lwip.c | 9 +++++++++ 4 files changed, 27 insertions(+), 1 deletion(-) diff --git a/components/mdns/mdns.c b/components/mdns/mdns.c index 38d678268..443b39846 100644 --- a/components/mdns/mdns.c +++ b/components/mdns/mdns.c @@ -3794,13 +3794,14 @@ static esp_err_t _mdns_send_search_action(mdns_action_type_t type, mdns_search_o */ static void _mdns_scheduler_run() { + MDNS_SERVICE_LOCK(); mdns_tx_packet_t * p = _mdns_server->tx_queue_head; mdns_action_t * action = NULL; if (!p) { + MDNS_SERVICE_UNLOCK(); return; } - MDNS_SERVICE_LOCK(); if ((int32_t)(p->send_at - (xTaskGetTickCount() * portTICK_PERIOD_MS)) < 0) { action = (mdns_action_t *)malloc(sizeof(mdns_action_t)); if (action) { diff --git a/components/mdns/mdns_networking.c b/components/mdns/mdns_networking.c index 4e64e36cf..9aac3ec89 100644 --- a/components/mdns/mdns_networking.c +++ b/components/mdns/mdns_networking.c @@ -62,6 +62,12 @@ static esp_err_t _udp_join_group(tcpip_adapter_if_t tcpip_if, mdns_ip_protocol_t { struct netif * netif = NULL; void * nif = NULL; + + if (!tcpip_adapter_is_netif_up(tcpip_if)) { + // Network interface went down before event propagated, skipping IGMP config + return ESP_ERR_INVALID_STATE; + } + esp_err_t err = tcpip_adapter_get_netif(tcpip_if, &nif); if (err) { return ESP_ERR_INVALID_ARG; diff --git a/components/tcpip_adapter/include/tcpip_adapter.h b/components/tcpip_adapter/include/tcpip_adapter.h index 205c05fab..7d9e4ad8c 100644 --- a/components/tcpip_adapter/include/tcpip_adapter.h +++ b/components/tcpip_adapter/include/tcpip_adapter.h @@ -618,6 +618,16 @@ esp_err_t tcpip_adapter_get_hostname(tcpip_adapter_if_t tcpip_if, const char **h */ esp_err_t tcpip_adapter_get_netif(tcpip_adapter_if_t tcpip_if, void ** netif); +/** + * @brief Test if supplied interface is up or down + * + * @param[in] tcpip_if: the interface which we will get the hostname + * + * @return true: tcpip_if is UP + * false: tcpip_if id DOWN + */ +bool tcpip_adapter_is_netif_up(tcpip_adapter_if_t tcpip_if); + #ifdef __cplusplus } #endif diff --git a/components/tcpip_adapter/tcpip_adapter_lwip.c b/components/tcpip_adapter/tcpip_adapter_lwip.c index 85a76da81..f1c32b0e5 100644 --- a/components/tcpip_adapter/tcpip_adapter_lwip.c +++ b/components/tcpip_adapter/tcpip_adapter_lwip.c @@ -1222,4 +1222,13 @@ esp_err_t tcpip_adapter_get_netif(tcpip_adapter_if_t tcpip_if, void ** netif) return ESP_OK; } +bool tcpip_adapter_is_netif_up(tcpip_adapter_if_t tcpip_if) +{ + if (esp_netif[tcpip_if] != NULL && netif_is_up(esp_netif[tcpip_if])) { + return true; + } else { + return false; + } +} + #endif /* CONFIG_TCPIP_LWIP */