This patch set contains fixes for:
- deleting individual app key deletion as a result receiving
Config AppKey Delete message. The fix removes a dulpicate attempt
to write to config storage and some function call simplifications
- deleting a number of appkeys as a result of receiving
Config NetKey Delete message. When deleting multiple entries from a
queue, do not use queue iteration mechanism as the deletion of
multiple entries may result in seg fault. Instead, find and delete
bound keys one by one until none are found.
Inga Stotland (2):
mesh: Fix logic in AppKey deletion
mesh: Fix wholesale deletion of appkeys bound to a netkey
mesh/appkey.c | 32 ++++++++++++++++++++++++--------
mesh/node.c | 29 ++---------------------------
mesh/node.h | 4 ++--
3 files changed, 28 insertions(+), 37 deletions(-)
--
2.21.1
When a netkey is deleted all the appkeys bound to this key has
to be deleted as well. This fixes app_key queue manipulation to
avoid issues caused by modifying the queue while iterating over it:
instead of iteration over all the entries, find a first bound key,
delete it, find next... and so on, until there are no bound keys
left in the app_keys queue.
---
mesh/appkey.c | 26 +++++++++++++++++++++-----
1 file changed, 21 insertions(+), 5 deletions(-)
diff --git a/mesh/appkey.c b/mesh/appkey.c
index 3a1fd8a54..0eb268782 100644
--- a/mesh/appkey.c
+++ b/mesh/appkey.c
@@ -58,6 +58,14 @@ static bool match_key_index(const void *a, const void *b)
return key->app_idx == idx;
}
+static bool match_bound_key(const void *a, const void *b)
+{
+ const struct mesh_app_key *key = a;
+ uint16_t idx = L_PTR_TO_UINT(b);
+
+ return key->net_idx == idx;
+}
+
static bool match_replay_cache(const void *a, const void *b)
{
const struct mesh_msg *msg = a;
@@ -434,19 +442,27 @@ int appkey_key_delete(struct mesh_net *net, uint16_t net_idx,
void appkey_delete_bound_keys(struct mesh_net *net, uint16_t net_idx)
{
- const struct l_queue_entry *entry;
struct l_queue *app_keys;
+ struct mesh_node *node;
+ struct mesh_app_key *key;
app_keys = mesh_net_get_app_keys(net);
if (!app_keys)
return;
- entry = l_queue_get_entries(app_keys);
+ node = mesh_net_node_get(net);
- for (; entry; entry = entry->next) {
- struct mesh_app_key *key = entry->data;
+ key = l_queue_remove_if(app_keys, match_bound_key,
+ L_UINT_TO_PTR(net_idx));
+
+ while (key) {
+ node_app_key_delete(node, net_idx, key->app_idx);
+ mesh_config_app_key_del(node_config_get(node), net_idx,
+ key->app_idx);
+ appkey_key_free(key);
- appkey_key_delete(net, net_idx, key->app_idx);
+ key = l_queue_remove_if(app_keys, match_bound_key,
+ L_UINT_TO_PTR(net_idx));
}
}
--
2.21.1
Patchset Applied
On Thu, 2020-01-09 at 17:41 -0800, Inga Stotland wrote:
> This patch set contains fixes for:
> - deleting individual app key deletion as a result receiving
> Config AppKey Delete message. The fix removes a dulpicate attempt
> to write to config storage and some function call simplifications
>
> - deleting a number of appkeys as a result of receiving
> Config NetKey Delete message. When deleting multiple entries from a
> queue, do not use queue iteration mechanism as the deletion of
> multiple entries may result in seg fault. Instead, find and delete
> bound keys one by one until none are found.
>
>
> Inga Stotland (2):
> mesh: Fix logic in AppKey deletion
> mesh: Fix wholesale deletion of appkeys bound to a netkey
>
> mesh/appkey.c | 32 ++++++++++++++++++++++++--------
> mesh/node.c | 29 ++---------------------------
> mesh/node.h | 4 ++--
> 3 files changed, 28 insertions(+), 37 deletions(-)
>