Patch Applied On Fri, 2019-01-11 at 18:40 -0800, Inga Stotland wrote: > 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);