diff options
Diffstat (limited to 'src/tree_data_free.c')
-rw-r--r-- | src/tree_data_free.c | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/tree_data_free.c b/src/tree_data_free.c index bf17a91..0281ae5 100644 --- a/src/tree_data_free.c +++ b/src/tree_data_free.c @@ -166,7 +166,7 @@ lyd_free_subtree(struct lyd_node *node, ly_bool top) ly_free_prefix_data(opaq->format, opaq->val_prefix_data); } else if (node->schema->nodetype & LYD_NODE_INNER) { /* remove children hash table in case of inner data node */ - lyht_free(((struct lyd_node_inner *)node)->children_ht); + lyht_free(((struct lyd_node_inner *)node)->children_ht, NULL); ((struct lyd_node_inner *)node)->children_ht = NULL; /* free the children */ @@ -189,7 +189,7 @@ lyd_free_subtree(struct lyd_node *node, ly_bool top) /* unlink only the nodes from the first level, nodes in subtree are freed all, so no unlink is needed */ if (top) { - lyd_unlink_tree(node); + lyd_unlink(node); } free(node); @@ -202,6 +202,11 @@ lyd_free_tree(struct lyd_node *node) return; } + if (lysc_is_key(node->schema) && node->parent) { + LOGERR(LYD_CTX(node), LY_EINVAL, "Cannot free a list key \"%s\", free the list instance instead.", LYD_NAME(node)); + return; + } + lyd_free_subtree(node, 1); } @@ -223,6 +228,11 @@ lyd_free_(struct lyd_node *node, ly_bool top) } LY_LIST_FOR_SAFE(node, next, iter) { + if (lysc_is_key(iter->schema) && iter->parent) { + LOGERR(LYD_CTX(iter), LY_EINVAL, "Cannot free a list key \"%s\", free the list instance instead.", LYD_NAME(iter)); + return; + } + /* in case of the top-level nodes (node->parent is NULL), no unlinking needed */ lyd_free_subtree(iter, iter->parent ? 1 : 0); } |