mirror of
https://github.com/isc-projects/bind9.git
synced 2026-05-28 04:34:54 -04:00
Fix fix_iterator hang
If there are no more previous leaves, it means the queried name
precedes the entire range of names in the database, so we should just
move the iterator one step back and return, instead of continuing our
search for the predecessor.
This is similar to an earlier bug fixed in an earlier commit:
ea9a8cb392
This commit is contained in:
parent
2a724a808d
commit
77d4bb9751
1 changed files with 12 additions and 1 deletions
13
lib/dns/qp.c
13
lib/dns/qp.c
|
|
@ -2126,6 +2126,7 @@ fix_iterator(dns_qpreader_t *qp, dns_qpiter_t *iter, dns_qpnode_t *start,
|
|||
dns_qpiter_init(qp, iter);
|
||||
return (prevleaf(iter));
|
||||
}
|
||||
|
||||
/*
|
||||
* As long as the branch offset point is after the point where the
|
||||
* search key differs, we need to branch up and find a better leaf
|
||||
|
|
@ -2139,7 +2140,17 @@ fix_iterator(dns_qpreader_t *qp, dns_qpiter_t *iter, dns_qpnode_t *start,
|
|||
* go to the parent branch and iterate back to the
|
||||
* predecessor from that point.
|
||||
*/
|
||||
n = prevleaf(iter);
|
||||
isc_result_t result = dns_qpiter_prev(iter, NULL, NULL,
|
||||
NULL);
|
||||
if (result == ISC_R_NOMORE) {
|
||||
/*
|
||||
* This was the first domain; move the iterator
|
||||
* one step back from the origin and return.
|
||||
*/
|
||||
return (prevleaf(iter));
|
||||
}
|
||||
RUNTIME_CHECK(result == ISC_R_SUCCESS);
|
||||
n = iter->stack[iter->sp];
|
||||
leaf = n;
|
||||
} else {
|
||||
if (is_branch(n)) {
|
||||
|
|
|
|||
Loading…
Reference in a new issue