From b677d31fca2e54ca28318dd2b86e5cfe5bedb26c Mon Sep 17 00:00:00 2001 From: Mark Andrews Date: Fri, 5 Dec 2025 14:25:02 +1100 Subject: [PATCH] In dbiterator_prev, dereference_iter_node was being called too soon dns_rbtnodechain_prev requires the current node to still be valid which was not always the case after dereference_iter_node was called. Move the call to dereference_iter_node to after the dns_rbtnodechain_prev to preserve the node. --- lib/dns/rbtdb.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index 5f99080ce3..0a90e216c4 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -4675,11 +4675,12 @@ dbiterator_prev(dns_dbiterator_t *iterator DNS__DB_FLARG) { resume_iteration(rbtdbiter); } - dereference_iter_node(rbtdbiter DNS__DB_FLARG_PASS); - name = dns_fixedname_name(&rbtdbiter->name); origin = dns_fixedname_name(&rbtdbiter->origin); result = dns_rbtnodechain_prev(rbtdbiter->current, name, origin); + + dereference_iter_node(rbtdbiter DNS__DB_FLARG_PASS); + if (rbtdbiter->current == &rbtdbiter->nsec3chain && (result == ISC_R_SUCCESS || result == DNS_R_NEWORIGIN)) {