2921. [bug] The resolver could attempt to destroy a fetch context
to soon. [RT #19878]
This commit is contained in:
@@ -1,3 +1,6 @@
|
||||
2921. [bug] The resolver could attempt to destroy a fetch context
|
||||
to soon. [RT #19878]
|
||||
|
||||
2904. [bug] When using DLV, sub-zones of the zones in the DLV,
|
||||
could be incorrectly marked as insecure instead of
|
||||
secure leading to negative proofs failing. This was
|
||||
|
||||
+40
-33
@@ -15,7 +15,7 @@
|
||||
* PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* $Id: resolver.c,v 1.284.18.101 2010/02/26 23:46:36 tbox Exp $ */
|
||||
/* $Id: resolver.c,v 1.284.18.102 2010/06/23 01:48:55 marka Exp $ */
|
||||
|
||||
/*! \file */
|
||||
|
||||
@@ -5612,13 +5612,40 @@ answer_response(fetchctx_t *fctx) {
|
||||
return (result);
|
||||
}
|
||||
|
||||
static isc_boolean_t
|
||||
fctx_decreference(fetchctx_t *fctx) {
|
||||
isc_boolean_t bucket_empty = ISC_FALSE;
|
||||
|
||||
INSIST(fctx->references > 0);
|
||||
fctx->references--;
|
||||
if (fctx->references == 0) {
|
||||
/*
|
||||
* No one cares about the result of this fetch anymore.
|
||||
*/
|
||||
if (fctx->pending == 0 && fctx->nqueries == 0 &&
|
||||
ISC_LIST_EMPTY(fctx->validators) && SHUTTINGDOWN(fctx)) {
|
||||
/*
|
||||
* This fctx is already shutdown; we were just
|
||||
* waiting for the last reference to go away.
|
||||
*/
|
||||
bucket_empty = fctx_destroy(fctx);
|
||||
} else {
|
||||
/*
|
||||
* Initiate shutdown.
|
||||
*/
|
||||
fctx_shutdown(fctx);
|
||||
}
|
||||
}
|
||||
return (bucket_empty);
|
||||
}
|
||||
|
||||
static void
|
||||
resume_dslookup(isc_task_t *task, isc_event_t *event) {
|
||||
dns_fetchevent_t *fevent;
|
||||
dns_resolver_t *res;
|
||||
fetchctx_t *fctx;
|
||||
isc_result_t result;
|
||||
isc_boolean_t bucket_empty = ISC_FALSE;
|
||||
isc_boolean_t bucket_empty;
|
||||
isc_boolean_t locked = ISC_FALSE;
|
||||
unsigned int bucketnum;
|
||||
dns_rdataset_t nameservers;
|
||||
@@ -5722,9 +5749,7 @@ resume_dslookup(isc_task_t *task, isc_event_t *event) {
|
||||
isc_event_free(&event);
|
||||
if (!locked)
|
||||
LOCK(&res->buckets[bucketnum].lock);
|
||||
fctx->references--;
|
||||
if (fctx->references == 0)
|
||||
bucket_empty = fctx_destroy(fctx);
|
||||
bucket_empty = fctx_decreference(fctx);
|
||||
UNLOCK(&res->buckets[bucketnum].lock);
|
||||
if (bucket_empty)
|
||||
empty_bucket(res);
|
||||
@@ -6449,12 +6474,14 @@ resquery_response(isc_task_t *task, isc_event_t *event) {
|
||||
&fctx->nsfetch);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
fctx_done(fctx, result, __LINE__);
|
||||
LOCK(&fctx->res->buckets[fctx->bucketnum].lock);
|
||||
fctx->references++;
|
||||
UNLOCK(&fctx->res->buckets[fctx->bucketnum].lock);
|
||||
result = fctx_stopidletimer(fctx);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
fctx_done(fctx, result, __LINE__);
|
||||
else {
|
||||
LOCK(&fctx->res->buckets[fctx->bucketnum].lock);
|
||||
fctx->references++;
|
||||
UNLOCK(&fctx->res->buckets[fctx->bucketnum].lock);
|
||||
result = fctx_stopidletimer(fctx);
|
||||
if (result != ISC_R_SUCCESS)
|
||||
fctx_done(fctx, result, __LINE__);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* We're done.
|
||||
@@ -7288,7 +7315,7 @@ dns_resolver_destroyfetch(dns_fetch_t **fetchp) {
|
||||
dns_fetchevent_t *event, *next_event;
|
||||
fetchctx_t *fctx;
|
||||
unsigned int bucketnum;
|
||||
isc_boolean_t bucket_empty = ISC_FALSE;
|
||||
isc_boolean_t bucket_empty;
|
||||
|
||||
REQUIRE(fetchp != NULL);
|
||||
fetch = *fetchp;
|
||||
@@ -7316,27 +7343,7 @@ dns_resolver_destroyfetch(dns_fetch_t **fetchp) {
|
||||
}
|
||||
}
|
||||
|
||||
INSIST(fctx->references > 0);
|
||||
fctx->references--;
|
||||
if (fctx->references == 0) {
|
||||
/*
|
||||
* No one cares about the result of this fetch anymore.
|
||||
*/
|
||||
if (fctx->pending == 0 && fctx->nqueries == 0 &&
|
||||
ISC_LIST_EMPTY(fctx->validators) &&
|
||||
SHUTTINGDOWN(fctx)) {
|
||||
/*
|
||||
* This fctx is already shutdown; we were just
|
||||
* waiting for the last reference to go away.
|
||||
*/
|
||||
bucket_empty = fctx_destroy(fctx);
|
||||
} else {
|
||||
/*
|
||||
* Initiate shutdown.
|
||||
*/
|
||||
fctx_shutdown(fctx);
|
||||
}
|
||||
}
|
||||
bucket_empty = fctx_decreference(fctx);
|
||||
|
||||
UNLOCK(&res->buckets[bucketnum].lock);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user