diff options
author | Igor Ryzhov <iryzhov@nfware.com> | 2024-01-13 21:09:18 +0100 |
---|---|---|
committer | Igor Ryzhov <iryzhov@nfware.com> | 2024-01-14 18:08:15 +0100 |
commit | 2b7d9532c8ab3590088aca0f22147224fce1df85 (patch) | |
tree | 05a75208462a4fc4e518d198600c990f38a27388 /lib/yang.c | |
parent | Merge pull request #15151 from idryzhov/mgmtd-vrf (diff) | |
download | frr-2b7d9532c8ab3590088aca0f22147224fce1df85.tar.xz frr-2b7d9532c8ab3590088aca0f22147224fce1df85.zip |
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>
Diffstat (limited to 'lib/yang.c')
-rw-r--r-- | lib/yang.c | 27 |
1 files changed, 15 insertions, 12 deletions
diff --git a/lib/yang.c b/lib/yang.c index 5b177f7fb..7d35fb0d3 100644 --- a/lib/yang.c +++ b/lib/yang.c @@ -1089,7 +1089,7 @@ LY_ERR yang_lyd_trim_xpath(struct lyd_node **root, const char *xpath) } return LY_SUCCESS; #else - struct lyd_node *node; + struct lyd_node *node, *sib; struct lyd_node **remove = NULL; struct ly_set *set = NULL; 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); - LYD_TREE_DFS_BEGIN (*root, node) { - /* - * If this is a direct matching node then include it's subtree - * which won't be marked and would otherwise be removed. - */ - if (node->priv == (void *)2) - LYD_TREE_DFS_continue = 1; - else if (!node->priv) { - *darr_append(remove) = node; - LYD_TREE_DFS_continue = 1; + LY_LIST_FOR(*root, sib) { + LYD_TREE_DFS_BEGIN (sib, node) { + /* + * If this is a direct matching node then include its + * subtree which won't be marked and would otherwise + * be removed. + */ + if (node->priv == (void *)2) + 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) { if (remove[i] == *root) |