This implements MESH_ERROR_NOT_FOUND error when we try to call Leave() from dbus api with incorrect token value (ex. Leave(0)) --- mesh/mesh.c | 10 +++++----- mesh/node.c | 7 +++++-- mesh/node.h | 2 +- mesh/storage.c | 4 ++-- 4 files changed, 13 insertions(+), 10 deletions(-) diff --git a/mesh/mesh.c b/mesh/mesh.c index 231a6bca4..f10b73331 100644 --- a/mesh/mesh.c +++ b/mesh/mesh.c @@ -65,7 +65,7 @@ struct bt_mesh { uint8_t max_filters; }; -struct join_data{ +struct join_data { struct l_dbus_message *msg; struct mesh_agent *agent; const char *sender; @@ -355,7 +355,7 @@ static void free_pending_join_call(bool failed) mesh_agent_remove(join_pending->agent); if (failed) - node_remove(join_pending->node); + (void)node_remove(join_pending->node); l_free(join_pending); join_pending = NULL; @@ -530,8 +530,7 @@ static void node_init_cb(struct mesh_node *node, struct mesh_agent *agent) if (!acceptor_start(num_ele, join_pending->uuid, mesh.algorithms, mesh.prov_timeout, agent, prov_complete_cb, - &mesh)) - { + &mesh)) { reply = dbus_error(join_pending->msg, MESH_ERROR_FAILED, "Failed to start provisioning acceptor"); goto fail; @@ -696,7 +695,8 @@ static struct l_dbus_message *leave_call(struct l_dbus *dbus, if (!l_dbus_message_get_arguments(msg, "t", &token)) return dbus_error(msg, MESH_ERROR_INVALID_ARGS, NULL); - node_remove(node_find_by_token(token)); + if (!node_remove(node_find_by_token(token))) + return dbus_error(msg, MESH_ERROR_NOT_FOUND, NULL); return l_dbus_message_new_method_return(msg); } diff --git a/mesh/node.c b/mesh/node.c index e99858623..2b9978908 100644 --- a/mesh/node.c +++ b/mesh/node.c @@ -256,11 +256,12 @@ static void free_node_resources(void *data) /* * This function is called to free resources and remove the * configuration files for the specified node. + * The false is returned when there is no node to be removed */ -void node_remove(struct mesh_node *node) +bool node_remove(struct mesh_node *node) { if (!node) - return; + return false; l_queue_remove(nodes, node); @@ -268,6 +269,7 @@ void node_remove(struct mesh_node *node) storage_remove_node_config(node); free_node_resources(node); + return true; } static bool add_models(struct mesh_node *node, struct node_element *ele, @@ -1078,6 +1080,7 @@ static bool validate_model_property(struct node_element *ele, while (l_dbus_message_iter_next_entry(&ids, &vendor_id, &mod_id)) { struct mesh_model *mod; + mod = l_queue_find(ele->models, match_model_id, L_UINT_TO_PTR((vendor_id << 16) | mod_id)); if (!mod) diff --git a/mesh/node.h b/mesh/node.h index 142527b30..5f045ee2d 100644 --- a/mesh/node.h +++ b/mesh/node.h @@ -34,7 +34,7 @@ typedef void (*node_join_ready_func_t) (struct mesh_node *node, struct mesh_agent *agent); struct mesh_node *node_new(const uint8_t uuid[16]); -void node_remove(struct mesh_node *node); +bool node_remove(struct mesh_node *node); void node_join(const char *app_path, const char *sender, const uint8_t *uuid, node_join_ready_func_t cb); uint8_t *node_uuid_get(struct mesh_node *node); diff --git a/mesh/storage.c b/mesh/storage.c index 1a9945aa8..7ae0ac5b1 100644 --- a/mesh/storage.c +++ b/mesh/storage.c @@ -77,7 +77,7 @@ static bool read_node_cb(struct mesh_db_node *db_node, void *user_data) uint8_t *uuid; if (!node_init_from_storage(node, db_node)) { - node_remove(node); + (void)node_remove(node); return false; } @@ -220,7 +220,7 @@ static bool parse_config(char *in_file, char *out_dir, const uint8_t uuid[16]) if (!result) { json_object_put(jnode); - node_remove(node); + (void)node_remove(node); } node_jconfig_set(node, jnode); -- 2.20.1