diff options
author | Inga Stotland <inga.stotland@intel.com> | 2019-01-11 18:40:55 -0800 |
---|---|---|
committer | Brian Gix <brian.gix@intel.com> | 2019-01-14 14:02:09 -0800 |
commit | 9ce5a51872e8e145aa07790f4ddcfeba89530197 (patch) | |
tree | 38bdef0c3c6248b55fad635d1330394b43621ad6 /mesh/mesh.c | |
parent | 1ec20825822ab9d05028f88d13bf6765dd29efe8 (diff) | |
download | bluez-9ce5a51872e8e145aa07790f4ddcfeba89530197.tar.gz |
mesh: Clean up when finishing the Join call
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.
Diffstat (limited to 'mesh/mesh.c')
-rw-r--r-- | mesh/mesh.c | 59 |
1 files changed, 25 insertions, 34 deletions
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, |