Skip to content

Commit ef3213d

Browse files
committed
Bugfix on erase_prefix when erasing a full hash_node
Make sure that the hash_node is cleared if erase_prefix has remove all values in it. It can otherwise leads to a segfault down the line.
1 parent 22c25b3 commit ef3213d

File tree

2 files changed

+22
-0
lines changed

2 files changed

+22
-0
lines changed

include/tsl/htrie_hash.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1736,6 +1736,10 @@ class htrie_hash {
17361736
}
17371737
}
17381738

1739+
if (hnode.array_hash().empty()) {
1740+
clear_empty_nodes(hnode);
1741+
}
1742+
17391743
return nb_erased;
17401744
}
17411745

tests/trie_map_tests.cpp

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -477,6 +477,9 @@ BOOST_AUTO_TEST_CASE(test_erase_prefix_all_1) {
477477
BOOST_CHECK_EQUAL(map.size(), 1000);
478478
BOOST_CHECK_EQUAL(map.erase_prefix(""), 1000);
479479
BOOST_CHECK_EQUAL(map.size(), 0);
480+
481+
auto range = map.equal_prefix_range("");
482+
BOOST_CHECK_EQUAL(std::distance(range.first, range.second), 0);
480483
}
481484

482485
BOOST_AUTO_TEST_CASE(test_erase_prefix_all_2) {
@@ -485,6 +488,21 @@ BOOST_AUTO_TEST_CASE(test_erase_prefix_all_2) {
485488
BOOST_CHECK_EQUAL(map.size(), 1000);
486489
BOOST_CHECK_EQUAL(map.erase_prefix("Ke"), 1000);
487490
BOOST_CHECK_EQUAL(map.size(), 0);
491+
492+
auto range = map.equal_prefix_range("Ke");
493+
BOOST_CHECK_EQUAL(std::distance(range.first, range.second), 0);
494+
}
495+
496+
BOOST_AUTO_TEST_CASE(test_erase_prefix_all_hash_node) {
497+
tsl::htrie_map<char, std::int64_t> map;
498+
map = utils::get_filled_map<tsl::htrie_map<char, std::int64_t>>(16, 16);
499+
500+
BOOST_CHECK_EQUAL(map.size(), 16);
501+
BOOST_CHECK_EQUAL(map.erase_prefix("Ke"), 16);
502+
BOOST_CHECK_EQUAL(map.size(), 0);
503+
504+
auto range = map.equal_prefix_range("Ke");
505+
BOOST_CHECK_EQUAL(std::distance(range.first, range.second), 0);
488506
}
489507

490508
BOOST_AUTO_TEST_CASE(test_erase_prefix_none) {

0 commit comments

Comments
 (0)