Skip to content

Commit bff6f26

Browse files
committed
lyds tree BUGFIX for rb_remove_node()
Added based on static code analysis.
1 parent 8760d96 commit bff6f26

File tree

1 file changed

+14
-9
lines changed

1 file changed

+14
-9
lines changed

src/tree_data_sorted.c

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -278,12 +278,13 @@ rb_compare_lists(const struct lyd_node *n1, const struct lyd_node *n2)
278278
/**
279279
* @brief Release unlinked red-black node.
280280
*
281-
* @param[in] rbn Node to free.
281+
* @param[in,out] rbn Node to free, is set to NULL.
282282
*/
283283
static void
284-
rb_free_node(struct rb_node *rbn)
284+
rb_free_node(struct rb_node **rbn)
285285
{
286-
free(rbn);
286+
free(*rbn);
287+
*rbn = NULL;
287288
}
288289

289290
/**
@@ -356,7 +357,7 @@ lyds_free_tree(struct rb_node *rbt)
356357

357358
/* There is no rebalancing. */
358359
for (rbn = rb_iter_begin(rbt, &iter_state); rbn; rbn = rb_iter_next(&iter_state)) {
359-
rb_free_node(rbn);
360+
rb_free_node(&rbn);
360361
}
361362
}
362363

@@ -935,7 +936,7 @@ lyds_pool_clean(struct lyds_pool *pool)
935936
struct rb_node *iter;
936937

937938
for (iter = pool->rbn; iter; iter = rb_iter_next(&pool->iter_state)) {
938-
rb_free_node(iter);
939+
rb_free_node(&iter);
939940
}
940941
pool->rbn = NULL;
941942

@@ -977,6 +978,10 @@ rb_remove_node(struct lyd_meta *root_meta, struct rb_node **rbt, struct lyd_node
977978
/* remove node */
978979
rbn = rb_remove(rbt, rbn);
979980
*removed = rbn;
981+
if (rbn == *rbt) {
982+
/* rbn was the last node, assurance that root will be set to NULL */
983+
*rbt = NULL;
984+
}
980985

981986
/* the root of the Red-black tree may changed due to removal, so update the pointer to the root */
982987
RBT_SET(root_meta, *rbt);
@@ -1349,7 +1354,7 @@ lyds_unlink(struct lyd_node **leader, struct lyd_node *node)
13491354
}
13501355

13511356
rb_remove_node(root_meta, &rbt, node, &removed);
1352-
rb_free_node(removed);
1357+
rb_free_node(&removed);
13531358
}
13541359

13551360
void
@@ -1383,15 +1388,15 @@ lyds_split(struct lyd_node **first_sibling, struct lyd_node *leader, struct lyd_
13831388
if (!start || (start->schema != node->schema)) {
13841389
/* @p node is the last node, remove from Red-black tree and unlink */
13851390
rb_remove_node(root_meta, &rbt, node, &rbn);
1386-
rb_free_node(rbn);
1391+
rb_free_node(&rbn);
13871392
lyd_unlink_ignore_lyds(first_sibling, node);
13881393
*next_p = start;
13891394
goto cleanup;
13901395
}
13911396

13921397
/* remove @p node from Red-black tree and unlink */
13931398
rb_remove_node(root_meta, &rbt, node, &rbn);
1394-
rb_free_node(rbn);
1399+
rb_free_node(&rbn);
13951400
lyd_unlink_ignore_lyds(first_sibling, node);
13961401

13971402
/* remove the rest of nodes from Red-black tree and unlink */
@@ -1401,7 +1406,7 @@ lyds_split(struct lyd_node **first_sibling, struct lyd_node *leader, struct lyd_
14011406
break;
14021407
}
14031408
rb_remove_node(root_meta, &rbt, iter, &rbn);
1404-
rb_free_node(rbn);
1409+
rb_free_node(&rbn);
14051410
lyd_unlink_ignore_lyds(first_sibling, iter);
14061411
/* insert them to the second (leaf-)list */
14071412
lyd_insert_after_node(&node, dst, iter);

0 commit comments

Comments
 (0)