Skip to content

Commit e3b4034

Browse files
author
zhangzhuang08
committed
fix: prevent null pointer dereference in rb_tree delete_fixup
1 parent 21f5615 commit e3b4034

File tree

1 file changed

+25
-0
lines changed

1 file changed

+25
-0
lines changed

src/data_structures/rb_tree.rs

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -367,6 +367,12 @@ unsafe fn delete_fixup<K: Ord, V>(tree: &mut RBTree<K, V>, mut parent: *mut RBNo
367367
let mut sr: *mut RBNode<K, V>;
368368

369369
loop {
370+
// rb-tree will keep color balance up to root,
371+
// if parent is null, we are done.
372+
if parent.is_null() {
373+
break;
374+
}
375+
370376
/*
371377
* Loop invariants:
372378
* - node is black (or null on first iteration)
@@ -647,4 +653,23 @@ mod tests {
647653
let s: String = tree.iter().map(|x| x.value).collect();
648654
assert_eq!(s, "hlo orl!");
649655
}
656+
657+
#[test]
658+
fn delete_edge_case_null_pointer_guard() {
659+
let mut tree = RBTree::<i8, i8>::new();
660+
tree.insert(4, 4);
661+
tree.insert(2, 2);
662+
tree.insert(5, 5);
663+
tree.insert(0, 0);
664+
tree.insert(3, 3);
665+
tree.insert(-1, -1);
666+
tree.insert(1, 1);
667+
tree.insert(-2, -2);
668+
tree.insert(6, 6);
669+
tree.insert(7, 7);
670+
tree.insert(8, 8);
671+
tree.delete(&1);
672+
tree.delete(&3);
673+
tree.delete(&-1);
674+
}
650675
}

0 commit comments

Comments
 (0)