Просмотр исходного кода

mdns: fixed crash on event during deinit

mdns library deinitialization destroys internal structures including action queue. if an event (e.g. network update) received
after some essential stucture is destoyed, an unexpected behavour might be introduced (e.g. crash of adding the event notification
to the action queue which was already destroyed

Closes WIFI-1485
David Cermak 6 лет назад
Родитель
Сommit
eaa2f12d67
1 измененных файлов с 8 добавлено и 5 удалено
  1. 8 5
      components/mdns/mdns.c

+ 8 - 5
components/mdns/mdns.c

@@ -4301,6 +4301,14 @@ void mdns_free(void)
     if (!_mdns_server) {
         return;
     }
+
+    // Unregister handlers before destoying the mdns internals to avoid receiving asyc events while deinit
+    esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler);
+    esp_event_handler_unregister(IP_EVENT, ESP_EVENT_ANY_ID, &event_handler);
+#if CONFIG_ETH_ENABLED
+    esp_event_handler_unregister(ETH_EVENT, ESP_EVENT_ANY_ID, &event_handler);
+#endif
+
     mdns_service_remove_all();
     _mdns_service_task_stop();
     for (i=0; i<MDNS_IF_MAX; i++) {
@@ -4331,11 +4339,6 @@ void mdns_free(void)
         free(h);
     }
     vSemaphoreDelete(_mdns_server->lock);
-    esp_event_handler_unregister(WIFI_EVENT, ESP_EVENT_ANY_ID, &event_handler);
-    esp_event_handler_unregister(IP_EVENT, ESP_EVENT_ANY_ID, &event_handler);
-#if CONFIG_ETH_ENABLED
-    esp_event_handler_unregister(ETH_EVENT, ESP_EVENT_ANY_ID, &event_handler);
-#endif
     free(_mdns_server);
     _mdns_server = NULL;
 }