mirror of
https://github.com/NLnetLabs/unbound.git
synced 2025-12-24 00:29:58 -05:00
Fixup crash if root prime has a timeout and parent qstate has been deleted.
git-svn-id: file:///svn/unbound/trunk@1626 be551aaa-1e26-0410-a405-d3ace91eadb9
This commit is contained in:
parent
7758098250
commit
5e2189bb35
2 changed files with 15 additions and 8 deletions
|
|
@ -6,6 +6,8 @@
|
||||||
Most easily triggered on XP (not Vista), maybe because of the
|
Most easily triggered on XP (not Vista), maybe because of the
|
||||||
network stack encouraging large messages backlogs.
|
network stack encouraging large messages backlogs.
|
||||||
- change in debug statements.
|
- change in debug statements.
|
||||||
|
- Fixed bug that could cause a crash if root prime failed when there
|
||||||
|
were message backlogs.
|
||||||
|
|
||||||
26 May 2009: Wouter
|
26 May 2009: Wouter
|
||||||
- Thanks again to Brett Carr, found an assertion that was not true.
|
- Thanks again to Brett Carr, found an assertion that was not true.
|
||||||
|
|
|
||||||
|
|
@ -551,12 +551,6 @@ prime_root(struct module_qstate* qstate, struct iter_qstate* iq,
|
||||||
verbose(VERB_ALGO, "Cannot prime due to lack of hints");
|
verbose(VERB_ALGO, "Cannot prime due to lack of hints");
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/* copy dp; to avoid messing up available list for other thr/queries */
|
|
||||||
dp = delegpt_copy(dp, qstate->region);
|
|
||||||
if(!dp) {
|
|
||||||
log_err("out of memory priming root, copydp");
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
/* Priming requests start at the QUERYTARGETS state, skipping
|
/* Priming requests start at the QUERYTARGETS state, skipping
|
||||||
* the normal INIT state logic (which would cause an infloop). */
|
* the normal INIT state logic (which would cause an infloop). */
|
||||||
if(!generate_sub_request((uint8_t*)"\000", 1, LDNS_RR_TYPE_NS,
|
if(!generate_sub_request((uint8_t*)"\000", 1, LDNS_RR_TYPE_NS,
|
||||||
|
|
@ -568,8 +562,17 @@ prime_root(struct module_qstate* qstate, struct iter_qstate* iq,
|
||||||
if(subq) {
|
if(subq) {
|
||||||
struct iter_qstate* subiq =
|
struct iter_qstate* subiq =
|
||||||
(struct iter_qstate*)subq->minfo[id];
|
(struct iter_qstate*)subq->minfo[id];
|
||||||
/* Set the initial delegation point to the hint. */
|
/* Set the initial delegation point to the hint.
|
||||||
subiq->dp = dp;
|
* copy dp, it is now part of the root prime query.
|
||||||
|
* dp was part of in the fixed hints structure. */
|
||||||
|
subiq->dp = delegpt_copy(dp, subq->region);
|
||||||
|
if(!subiq->dp) {
|
||||||
|
log_err("out of memory priming root, copydp");
|
||||||
|
fptr_ok(fptr_whitelist_modenv_kill_sub(
|
||||||
|
qstate->env->kill_sub));
|
||||||
|
(*qstate->env->kill_sub)(subq);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
/* there should not be any target queries. */
|
/* there should not be any target queries. */
|
||||||
subiq->num_target_queries = 0;
|
subiq->num_target_queries = 0;
|
||||||
subiq->dnssec_expected = iter_indicates_dnssec(
|
subiq->dnssec_expected = iter_indicates_dnssec(
|
||||||
|
|
@ -611,6 +614,8 @@ prime_stub(struct module_qstate* qstate, struct iter_qstate* iq,
|
||||||
|
|
||||||
/* is it a noprime stub (always use) */
|
/* is it a noprime stub (always use) */
|
||||||
if(stub->noprime) {
|
if(stub->noprime) {
|
||||||
|
/* copy the dp out of the fixed hints structure, so that
|
||||||
|
* it can be changed when servicing this query */
|
||||||
iq->dp = delegpt_copy(stub_dp, qstate->region);
|
iq->dp = delegpt_copy(stub_dp, qstate->region);
|
||||||
if(!iq->dp) {
|
if(!iq->dp) {
|
||||||
log_err("out of memory priming stub");
|
log_err("out of memory priming stub");
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue