lib: fix yang_lyd_trim_xpath

We should traverse all top-level siblings, not only the first one.

Signed-off-by: Igor Ryzhov <iryzhov@nfware.com>
This commit is contained in:
Igor Ryzhov 2024-01-13 22:09:18 +02:00
parent d9d5f79610
commit 2b7d9532c8

View File

@ -1089,7 +1089,7 @@ LY_ERR yang_lyd_trim_xpath(struct lyd_node **root, const char *xpath)
} }
return LY_SUCCESS; return LY_SUCCESS;
#else #else
struct lyd_node *node; struct lyd_node *node, *sib;
struct lyd_node **remove = NULL; struct lyd_node **remove = NULL;
struct ly_set *set = NULL; struct ly_set *set = NULL;
uint32_t i; uint32_t i;
@ -1123,18 +1123,21 @@ LY_ERR yang_lyd_trim_xpath(struct lyd_node **root, const char *xpath)
} }
darr_ensure_cap(remove, 128); darr_ensure_cap(remove, 128);
LYD_TREE_DFS_BEGIN (*root, node) { LY_LIST_FOR(*root, sib) {
/* LYD_TREE_DFS_BEGIN (sib, node) {
* If this is a direct matching node then include it's subtree /*
* which won't be marked and would otherwise be removed. * If this is a direct matching node then include its
*/ * subtree which won't be marked and would otherwise
if (node->priv == (void *)2) * be removed.
LYD_TREE_DFS_continue = 1; */
else if (!node->priv) { if (node->priv == (void *)2)
*darr_append(remove) = node; LYD_TREE_DFS_continue = 1;
LYD_TREE_DFS_continue = 1; else if (!node->priv) {
*darr_append(remove) = node;
LYD_TREE_DFS_continue = 1;
}
LYD_TREE_DFS_END(sib, node);
} }
LYD_TREE_DFS_END(*root, node);
} }
darr_foreach_i (remove, i) { darr_foreach_i (remove, i) {
if (remove[i] == *root) if (remove[i] == *root)