From ac2e0bc3ff375807638cfd508f417a80290a37e8 Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Fri, 26 May 2023 10:28:39 +1000 Subject: [PATCH 1/2] Move isc_mem_put to after node is checked for equality isc_mem_put NULL's the pointer to the memory being freed. The equality test 'parent->r == node' was accidentally being turned into a test against NULL. --- lib/isc/radix.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/isc/radix.c b/lib/isc/radix.c index d84e5d0302..54c03832f1 100644 --- a/lib/isc/radix.c +++ b/lib/isc/radix.c @@ -694,13 +694,13 @@ isc_radix_remove(isc_radix_tree_t *radix, isc_radix_node_t *node) { return; } - isc_mem_put(radix->mctx, node, sizeof(*node)); - radix->num_active_node--; - if (parent->r == node) { parent->r = child; } else { INSIST(parent->l == node); parent->l = child; } + + isc_mem_put(radix->mctx, node, sizeof(*node)); + radix->num_active_node--; } From 03ebe96110c4ec09563d3f4d6bda853e6f5ed88b Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Fri, 26 May 2023 11:09:33 +1000 Subject: [PATCH 2/2] Add regression test for [GL # 4090] These insertions are added to produce a radix tree that will trigger the INSIST reported in [GL #4090]. Due to fixes added since BIND 9.9 an extra insert in needed to ensure node->parent is non NULL. --- tests/isc/radix_test.c | 50 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/tests/isc/radix_test.c b/tests/isc/radix_test.c index 1e03e52f2d..fe589fe2b7 100644 --- a/tests/isc/radix_test.c +++ b/tests/isc/radix_test.c @@ -30,6 +30,55 @@ #include +/* test radix node removal */ +ISC_RUN_TEST_IMPL(isc_radix_remove) { + isc_radix_tree_t *radix = NULL; + isc_radix_node_t *node; + isc_prefix_t prefix; + isc_result_t result; + struct in_addr in_addr; + isc_netaddr_t netaddr; + + UNUSED(state); + + result = isc_radix_create(mctx, &radix, 32); + assert_int_equal(result, ISC_R_SUCCESS); + + in_addr.s_addr = inet_addr("1.1.1.1"); + isc_netaddr_fromin(&netaddr, &in_addr); + NETADDR_TO_PREFIX_T(&netaddr, prefix, 32); + + node = NULL; + result = isc_radix_insert(radix, &node, NULL, &prefix); + assert_int_equal(result, ISC_R_SUCCESS); + node->data[0] = (void *)32; + isc_refcount_destroy(&prefix.refcount); + + in_addr.s_addr = inet_addr("1.0.0.0"); + isc_netaddr_fromin(&netaddr, &in_addr); + NETADDR_TO_PREFIX_T(&netaddr, prefix, 8); + + node = NULL; + result = isc_radix_insert(radix, &node, NULL, &prefix); + assert_int_equal(result, ISC_R_SUCCESS); + node->data[0] = (void *)8; + isc_refcount_destroy(&prefix.refcount); + + in_addr.s_addr = inet_addr("1.1.1.0"); + isc_netaddr_fromin(&netaddr, &in_addr); + NETADDR_TO_PREFIX_T(&netaddr, prefix, 24); + + node = NULL; + result = isc_radix_insert(radix, &node, NULL, &prefix); + assert_int_equal(result, ISC_R_SUCCESS); + node->data[0] = (void *)24; + isc_refcount_destroy(&prefix.refcount); + + isc_radix_remove(radix, node); + + isc_radix_destroy(radix, NULL); +} + /* test radix searching */ ISC_RUN_TEST_IMPL(isc_radix_search) { isc_radix_tree_t *radix = NULL; @@ -80,6 +129,7 @@ ISC_RUN_TEST_IMPL(isc_radix_search) { ISC_TEST_LIST_START +ISC_TEST_ENTRY(isc_radix_remove) ISC_TEST_ENTRY(isc_radix_search) ISC_TEST_LIST_END