Skip to content

Commit 9aa8301

Browse files
lePicimichalvasko
authored andcommitted
lyds_tree BUGFIX for-iteration over lyd and unlink
Watch out for infinite loops when iterating over nodes while reordering.
1 parent 51e0deb commit 9aa8301

File tree

2 files changed

+9
-7
lines changed

2 files changed

+9
-7
lines changed

src/tree_data.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -548,7 +548,7 @@ lyd_insert_after_node(struct lyd_node **first_sibling_p, struct lyd_node *siblin
548548
struct lyd_node_inner *par;
549549
struct lyd_node *first_sibling;
550550

551-
assert(!node->next && (node->prev == node));
551+
assert(!node->next && (node->prev == node) && (sibling != node));
552552

553553
if (sibling->next) {
554554
/* sibling had a succeeding node */
@@ -584,7 +584,7 @@ lyd_insert_before_node(struct lyd_node *sibling, struct lyd_node *node)
584584
{
585585
struct lyd_node_inner *par;
586586

587-
assert(!node->next && (node->prev == node));
587+
assert(!node->next && (node->prev == node) && (sibling != node));
588588

589589
node->next = sibling;
590590
/* covers situation of sibling being first */

src/tree_data_sorted.c

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -935,7 +935,7 @@ lyds_pool_clean(struct lyds_pool *pool)
935935
pool->rbn = NULL;
936936

937937
for (meta = pool->meta; meta; meta = next) {
938-
next = meta->next ? meta->next : NULL;
938+
next = meta->next;
939939
RBT_SET(meta, NULL);
940940
lyd_free_meta_single(meta);
941941
}
@@ -1055,9 +1055,10 @@ lyds_additionally_create_rb_nodes(struct lyd_node **first_sibling, struct lyd_no
10551055
LY_ERR ret;
10561056
ly_bool max;
10571057
struct rb_node *rbn;
1058-
struct lyd_node *iter;
1058+
struct lyd_node *iter, *next;
10591059

1060-
for (iter = node; iter && (iter->schema == (*leader)->schema); iter = iter->next) {
1060+
for (iter = node; iter && (iter->schema == (*leader)->schema); iter = next) {
1061+
next = iter->next;
10611062
ret = lyds_create_node(iter, &rbn);
10621063
LY_CHECK_RET(ret);
10631064
rb_insert_node(rbt, rbn, &max);
@@ -1118,15 +1119,16 @@ lyds_additionally_reuse_rb_tree(struct lyd_node **first_sibling, struct lyd_node
11181119
struct rb_node **rbt, struct lyds_pool *pool, struct lyd_node **next)
11191120
{
11201121
ly_bool max;
1121-
struct lyd_node *iter;
1122+
struct lyd_node *iter, *next_node;
11221123

11231124
/* let's begin with the leader */
11241125
RBN_RESET(pool->rbn, *leader);
11251126
*rbt = pool->rbn;
11261127
pool->rbn = rb_iter_next(&pool->iter_state);
11271128

11281129
/* continue with the rest of the nodes */
1129-
for (iter = (*leader)->next; iter && (iter->schema == (*leader)->schema); iter = iter->next) {
1130+
for (iter = (*leader)->next; iter && (iter->schema == (*leader)->schema); iter = next_node) {
1131+
next_node = iter->next;
11301132
if (!pool->rbn) {
11311133
*next = iter;
11321134
return;

0 commit comments

Comments
 (0)