If a provisioner app quits or the daemon is stopped while there's an active scan for unprovisioned devices in progress, the scan needs to be explicitly canceled. --- mesh/manager.c | 8 ++++++++ mesh/manager.h | 1 + mesh/node.c | 10 ++++++++++ 3 files changed, 19 insertions(+) diff --git a/mesh/manager.c b/mesh/manager.c index 0b11b4541..adbb01280 100644 --- a/mesh/manager.c +++ b/mesh/manager.c @@ -794,3 +794,11 @@ bool manager_dbus_init(struct l_dbus *bus) return true; } + +void manager_scan_cancel(struct mesh_node *node) +{ + if (scan_node != node) + return; + + scan_cancel(NULL, node); +} diff --git a/mesh/manager.h b/mesh/manager.h index f27ca4181..5a4c7d94a 100644 --- a/mesh/manager.h +++ b/mesh/manager.h @@ -18,3 +18,4 @@ */ bool manager_dbus_init(struct l_dbus *dbus); +void manager_scan_cancel(struct mesh_node *node); diff --git a/mesh/node.c b/mesh/node.c index e23f32dd1..d6dd819eb 100644 --- a/mesh/node.c +++ b/mesh/node.c @@ -42,6 +42,7 @@ #include "mesh/error.h" #include "mesh/dbus.h" #include "mesh/agent.h" +#include "mesh/manager.h" #include "mesh/node.h" #define MIN_COMP_SIZE 14 @@ -310,6 +311,10 @@ static void free_node_resources(void *data) l_queue_destroy(node->elements, element_free); node->elements = NULL; + /* In case of a provisioner, stop active scanning */ + if (node->provisioner) + manager_scan_cancel(node); + free_node_dbus_resources(node); mesh_net_free(node->net); @@ -1166,6 +1171,11 @@ static void app_disc_cb(struct l_dbus *bus, void *user_data) l_info("App %s disconnected (%u)", node->owner, node->disc_watch); node->disc_watch = 0; + + /* In case of a provisioner, stop active scanning */ + if (node->provisioner) + manager_scan_cancel(node); + free_node_dbus_resources(node); } -- 2.21.0