Consolidate multiple instances where the pending Join data is freed into calling one function free_pending_join_call(). Also, add checks for NULL data in cleanup functions for storage, agent and provisioning acceptor. --- mesh/agent.c | 2 +- mesh/mesh.c | 59 +++++++++++++++++++------------------------- mesh/prov-acceptor.c | 5 ++-- mesh/storage.c | 3 +++ 4 files changed, 32 insertions(+), 37 deletions(-) diff --git a/mesh/agent.c b/mesh/agent.c index c6ff11802..88ad84d79 100644 --- a/mesh/agent.c +++ b/mesh/agent.c @@ -210,7 +210,7 @@ static void agent_free(void *agent_data) void mesh_agent_remove(struct mesh_agent *agent) { - if (!l_queue_find(agents, simple_match, agent)) + if (!agent || !l_queue_find(agents, simple_match, agent)) return; agent_free(agent); diff --git a/mesh/mesh.c b/mesh/mesh.c index 8971f7cc4..a1c26e77c 100644 --- a/mesh/mesh.c +++ b/mesh/mesh.c @@ -345,6 +345,28 @@ static void attach_exit(void *data) l_free(pending); } +static void free_pending_join_call(bool failed) +{ + if (!join_pending) + return; + + if (join_pending->disc_watch) + l_dbus_remove_watch(dbus_get_bus(), + join_pending->disc_watch); + + acceptor_cancel(&mesh); + + mesh_agent_remove(join_pending->agent); + + if (failed) { + storage_remove_node_config(join_pending->node); + node_free(join_pending->node); + } + + l_free(join_pending); + join_pending = NULL; +} + void mesh_cleanup(void) { struct l_dbus_message *reply; @@ -353,19 +375,12 @@ void mesh_cleanup(void) mgmt_unref(mgmt_mesh); if (join_pending) { + /* The Join() call failed since it has not been completed */ reply = dbus_error(join_pending->msg, MESH_ERROR_FAILED, "Failed. Exiting"); l_dbus_send(dbus_get_bus(), reply); - if (join_pending->disc_watch) - l_dbus_remove_watch(dbus_get_bus(), - join_pending->disc_watch); - - if (join_pending->node) - node_free(join_pending->node); - - l_free(join_pending); - join_pending = NULL; + free_pending_join_call(true); } l_queue_destroy(attach_queue, attach_exit); @@ -404,26 +419,6 @@ const char *mesh_status_str(uint8_t err) } } -static void free_pending_join_call(bool failed) -{ - if (!join_pending) - return; - - if (join_pending->disc_watch) - l_dbus_remove_watch(dbus_get_bus(), - join_pending->disc_watch); - - mesh_agent_remove(join_pending->agent); - - if (failed) { - storage_remove_node_config(join_pending->node); - mesh_agent_remove(join_pending->agent); - } - - l_free(join_pending); - join_pending = NULL; -} - /* This is being called if the app exits unexpectedly */ static void prov_disc_cb(struct l_dbus *bus, void *user_data) { @@ -433,8 +428,6 @@ static void prov_disc_cb(struct l_dbus *bus, void *user_data) if (join_pending->msg) l_dbus_message_unref(join_pending->msg); - acceptor_cancel(&mesh); - join_pending->disc_watch = 0; free_pending_join_call(true); @@ -553,9 +546,7 @@ static void node_init_cb(struct mesh_node *node, struct mesh_agent *agent) fail: l_dbus_send(dbus_get_bus(), reply); - mesh_agent_remove(join_pending->agent); - l_free(join_pending); - join_pending = NULL; + free_pending_join_call(true); } static struct l_dbus_message *join_network_call(struct l_dbus *dbus, diff --git a/mesh/prov-acceptor.c b/mesh/prov-acceptor.c index baa3c4d30..d983991d4 100644 --- a/mesh/prov-acceptor.c +++ b/mesh/prov-acceptor.c @@ -118,9 +118,10 @@ static struct mesh_prov_acceptor *prov = NULL; static void acceptor_free(void) { + if (!prov) + return; - if (prov) - l_timeout_remove(prov->timeout); + l_timeout_remove(prov->timeout); mesh_send_cancel(bec_filter, sizeof(bec_filter)); mesh_send_cancel(&pkt_filter, sizeof(pkt_filter)); diff --git a/mesh/storage.c b/mesh/storage.c index 57ae88b34..3a6614eb2 100644 --- a/mesh/storage.c +++ b/mesh/storage.c @@ -573,6 +573,9 @@ void storage_remove_node_config(struct mesh_node *node) struct json_object *jnode; const char *dir_name; + if (!node) + return; + jnode = node_jconfig_get(node); if (jnode) json_object_put(jnode); -- 2.17.2