@@ -278,12 +278,13 @@ rb_compare_lists(const struct lyd_node *n1, const struct lyd_node *n2)
278
278
/**
279
279
* @brief Release unlinked red-black node.
280
280
*
281
- * @param[in] rbn Node to free.
281
+ * @param[in,out ] rbn Node to free, is set to NULL .
282
282
*/
283
283
static void
284
- rb_free_node (struct rb_node * rbn )
284
+ rb_free_node (struct rb_node * * rbn )
285
285
{
286
- free (rbn );
286
+ free (* rbn );
287
+ * rbn = NULL ;
287
288
}
288
289
289
290
/**
@@ -356,7 +357,7 @@ lyds_free_tree(struct rb_node *rbt)
356
357
357
358
/* There is no rebalancing. */
358
359
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 );
360
361
}
361
362
}
362
363
@@ -935,7 +936,7 @@ lyds_pool_clean(struct lyds_pool *pool)
935
936
struct rb_node * iter ;
936
937
937
938
for (iter = pool -> rbn ; iter ; iter = rb_iter_next (& pool -> iter_state )) {
938
- rb_free_node (iter );
939
+ rb_free_node (& iter );
939
940
}
940
941
pool -> rbn = NULL ;
941
942
@@ -977,6 +978,10 @@ rb_remove_node(struct lyd_meta *root_meta, struct rb_node **rbt, struct lyd_node
977
978
/* remove node */
978
979
rbn = rb_remove (rbt , rbn );
979
980
* removed = rbn ;
981
+ if (rbn == * rbt ) {
982
+ /* rbn was the last node, assurance that root will be set to NULL */
983
+ * rbt = NULL ;
984
+ }
980
985
981
986
/* the root of the Red-black tree may changed due to removal, so update the pointer to the root */
982
987
RBT_SET (root_meta , * rbt );
@@ -1349,7 +1354,7 @@ lyds_unlink(struct lyd_node **leader, struct lyd_node *node)
1349
1354
}
1350
1355
1351
1356
rb_remove_node (root_meta , & rbt , node , & removed );
1352
- rb_free_node (removed );
1357
+ rb_free_node (& removed );
1353
1358
}
1354
1359
1355
1360
void
@@ -1383,15 +1388,15 @@ lyds_split(struct lyd_node **first_sibling, struct lyd_node *leader, struct lyd_
1383
1388
if (!start || (start -> schema != node -> schema )) {
1384
1389
/* @p node is the last node, remove from Red-black tree and unlink */
1385
1390
rb_remove_node (root_meta , & rbt , node , & rbn );
1386
- rb_free_node (rbn );
1391
+ rb_free_node (& rbn );
1387
1392
lyd_unlink_ignore_lyds (first_sibling , node );
1388
1393
* next_p = start ;
1389
1394
goto cleanup ;
1390
1395
}
1391
1396
1392
1397
/* remove @p node from Red-black tree and unlink */
1393
1398
rb_remove_node (root_meta , & rbt , node , & rbn );
1394
- rb_free_node (rbn );
1399
+ rb_free_node (& rbn );
1395
1400
lyd_unlink_ignore_lyds (first_sibling , node );
1396
1401
1397
1402
/* 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_
1401
1406
break ;
1402
1407
}
1403
1408
rb_remove_node (root_meta , & rbt , iter , & rbn );
1404
- rb_free_node (rbn );
1409
+ rb_free_node (& rbn );
1405
1410
lyd_unlink_ignore_lyds (first_sibling , iter );
1406
1411
/* insert them to the second (leaf-)list */
1407
1412
lyd_insert_after_node (& node , dst , iter );
0 commit comments