summaryrefslogtreecommitdiffstats
path: root/src/tree_data_free.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/tree_data_free.c')
-rw-r--r--src/tree_data_free.c14
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);
}