2
0
mirror of https://gitlab.isc.org/isc-projects/bind9 synced 2025-08-29 13:38:26 +00:00

In certain cases, the resolver's attempts to restart an address lookup

at the root could cause the fetch to deadlock (with itself) instead of
restarting. [RT #1225]
This commit is contained in:
Bob Halley 2001-05-02 17:29:17 +00:00
parent 3840dba289
commit 1a286a6613
2 changed files with 21 additions and 4 deletions

View File

@ -1,4 +1,9 @@
819. [bug] In certain cases, the resolver's attempts to
restart an address lookup at the root could cause
the fetch to deadlock (with itself) instead of
restarting. [RT #1225]
818. [bug] Certain pathological responses to ANY queries could
cause an assertion failure. [RT #1218]

View File

@ -15,7 +15,7 @@
* WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
/* $Id: adb.c,v 1.176 2001/05/01 23:17:48 gson Exp $ */
/* $Id: adb.c,v 1.177 2001/05/02 17:29:17 halley Exp $ */
/*
* Implementation notes
@ -342,6 +342,7 @@ static isc_result_t dbfind_a6(dns_adbname_t *, isc_stdtime_t);
#define NAME_IS_DEAD 0x40000000
#define NAME_HINT_OK DNS_ADBFIND_HINTOK
#define NAME_GLUE_OK DNS_ADBFIND_GLUEOK
#define NAME_STARTATROOT DNS_ADBFIND_STARTATROOT
#define NAME_DEAD(n) (((n)->flags & NAME_IS_DEAD) != 0)
#define NAME_NEEDSPOKE(n) (((n)->flags & NAME_NEEDS_POKE) != 0)
#define NAME_GLUEOK(n) (((n)->flags & NAME_GLUE_OK) != 0)
@ -406,6 +407,8 @@ static isc_result_t dbfind_a6(dns_adbname_t *, isc_stdtime_t);
#define GLUE_OK(nf, o) (!NAME_GLUEOK(nf) || (((o) & DNS_ADBFIND_GLUEOK) != 0))
#define HINT_OK(nf, o) (!NAME_HINTOK(nf) || (((o) & DNS_ADBFIND_HINTOK) != 0))
#define GLUEHINT_OK(nf, o) (GLUE_OK(nf, o) || HINT_OK(nf, o))
#define STARTATROOT_MATCHES(nf, o) (((nf)->flags & NAME_STARTATROOT) == \
((o) & DNS_ADBFIND_STARTATROOT))
#define ENTER_LEVEL 50
#define EXIT_LEVEL ENTER_LEVEL
@ -1771,7 +1774,8 @@ find_name_and_lock(dns_adb_t *adb, dns_name_t *name,
while (adbname != NULL) {
if (!NAME_DEAD(adbname)) {
if (dns_name_equal(name, &adbname->name)
&& GLUEHINT_OK(adbname, options))
&& GLUEHINT_OK(adbname, options)
&& STARTATROOT_MATCHES(adbname, options))
return (adbname);
}
adbname = ISC_LIST_NEXT(adbname, plink);
@ -2500,6 +2504,8 @@ dns_adb_createfind(dns_adb_t *adb, isc_task_t *task, isc_taskaction_t action,
adbname->flags |= NAME_HINT_OK;
if (FIND_GLUEOK(find))
adbname->flags |= NAME_GLUE_OK;
if (FIND_STARTATROOT(find))
adbname->flags |= NAME_STARTATROOT;
}
/*
@ -3706,6 +3712,7 @@ fetch_name_v4(dns_adbname_t *adbname, isc_boolean_t start_at_root) {
dns_name_t *name;
dns_rdataset_t rdataset;
dns_rdataset_t *nameservers;
unsigned int options;
INSIST(DNS_ADBNAME_VALID(adbname));
adb = adbname->adb;
@ -3719,6 +3726,7 @@ fetch_name_v4(dns_adbname_t *adbname, isc_boolean_t start_at_root) {
nameservers = NULL;
dns_rdataset_init(&rdataset);
options = 0;
if (start_at_root) {
DP(50, "fetch_name_v4: starting at DNS root for name %p",
adbname);
@ -3728,6 +3736,7 @@ fetch_name_v4(dns_adbname_t *adbname, isc_boolean_t start_at_root) {
if (result != ISC_R_SUCCESS && result != DNS_R_HINT)
goto cleanup;
nameservers = &rdataset;
options |= DNS_FETCHOPT_UNSHARED;
}
fetch = new_adbfetch(adb);
@ -3738,7 +3747,7 @@ fetch_name_v4(dns_adbname_t *adbname, isc_boolean_t start_at_root) {
result = dns_resolver_createfetch(adb->view->resolver, &adbname->name,
dns_rdatatype_a,
name, nameservers, NULL, 0,
name, nameservers, NULL, options,
adb->task, fetch_callback,
adbname, &fetch->rdataset, NULL,
&fetch->fetch);
@ -3805,6 +3814,7 @@ fetch_name_a6(dns_adbname_t *adbname, isc_boolean_t start_at_root) {
dns_name_t *name;
dns_rdataset_t rdataset;
dns_rdataset_t *nameservers;
unsigned int options;
INSIST(DNS_ADBNAME_VALID(adbname));
adb = adbname->adb;
@ -3818,6 +3828,7 @@ fetch_name_a6(dns_adbname_t *adbname, isc_boolean_t start_at_root) {
nameservers = NULL;
dns_rdataset_init(&rdataset);
options = 0;
if (start_at_root) {
DP(50, "fetch_name_a6: starting at DNS root for name %p",
adbname);
@ -3827,6 +3838,7 @@ fetch_name_a6(dns_adbname_t *adbname, isc_boolean_t start_at_root) {
if (result != ISC_R_SUCCESS && result != DNS_R_HINT)
goto cleanup;
nameservers = &rdataset;
options |= DNS_FETCHOPT_UNSHARED;
}
fetch = new_adbfetch6(adb, adbname, NULL);
@ -3838,7 +3850,7 @@ fetch_name_a6(dns_adbname_t *adbname, isc_boolean_t start_at_root) {
result = dns_resolver_createfetch(adb->view->resolver, &adbname->name,
dns_rdatatype_a6,
name, nameservers, NULL, 0,
name, nameservers, NULL, options,
adb->task, fetch_callback_a6,
adbname, &fetch->rdataset, NULL,
&fetch->fetch);