From: Brian Wellington Date: Fri, 28 Jul 2000 22:37:47 +0000 (+0000) Subject: 357. [bug] The server would crash if a response contained both X-Git-Tag: v9.1.0b2~2^2~35 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=cd54303345e0bcfd7f95a23667f4e47cd5c3e323;p=thirdparty%2Fbind9.git 357. [bug] The server would crash if a response contained both a CNAME and records of the query type. --- diff --git a/CHANGES b/CHANGES index cd1e21a1c63..1cc0a5161bd 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,6 @@ + 357. [bug] The server would crash if a response contained both + a CNAME and records of the query type. + 356. [cleanup] isc_task_send no longer requires event->sender to be non-null. diff --git a/lib/dns/resolver.c b/lib/dns/resolver.c index bc66bc58626..084975ebae4 100644 --- a/lib/dns/resolver.c +++ b/lib/dns/resolver.c @@ -15,7 +15,7 @@ * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -/* $Id: resolver.c,v 1.159 2000/07/27 22:05:04 bwelling Exp $ */ +/* $Id: resolver.c,v 1.160 2000/07/28 22:37:47 bwelling Exp $ */ #include @@ -3350,7 +3350,7 @@ answer_response(fetchctx_t *fctx) { dns_name_t *name, *qname, tname; dns_rdataset_t *rdataset; isc_boolean_t done, external, chaining, aa, found, want_chaining; - isc_boolean_t have_answer; + isc_boolean_t have_answer, found_cname, found_type; unsigned int aflag; dns_rdatatype_t type; dns_fixedname_t dname; @@ -3365,6 +3365,8 @@ answer_response(fetchctx_t *fctx) { */ done = ISC_FALSE; + found_cname = ISC_FALSE; + found_type = ISC_FALSE; chaining = ISC_FALSE; have_answer = ISC_FALSE; want_chaining = ISC_FALSE; @@ -3386,11 +3388,12 @@ answer_response(fetchctx_t *fctx) { found = ISC_FALSE; want_chaining = ISC_FALSE; aflag = 0; - if (rdataset->type == type) { + if (rdataset->type == type && !found_cname) { /* * We've found an ordinary answer. */ found = ISC_TRUE; + found_type = ISC_TRUE; done = ISC_TRUE; aflag = DNS_RDATASETATTR_ANSWER; } else if (type == dns_rdatatype_any) { @@ -3402,15 +3405,18 @@ answer_response(fetchctx_t *fctx) { found = ISC_TRUE; aflag = DNS_RDATASETATTR_ANSWER; } else if (rdataset->type == dns_rdatatype_sig - && rdataset->covers == type) { + && rdataset->covers == type + && !found_cname) { /* * We've found a signature that * covers the type we're looking for. */ found = ISC_TRUE; + found_type = ISC_TRUE; aflag = DNS_RDATASETATTR_ANSWERSIG; } else if (rdataset->type == - dns_rdatatype_cname) { + dns_rdatatype_cname + && !found_type) { /* * We're looking for something else, * but we found a CNAME. @@ -3423,6 +3429,7 @@ answer_response(fetchctx_t *fctx) { type == dns_rdatatype_nxt) return (DNS_R_FORMERR); found = ISC_TRUE; + found_cname = ISC_TRUE; want_chaining = ISC_TRUE; aflag = DNS_RDATASETATTR_ANSWER; result = cname_target(rdataset, @@ -3431,12 +3438,14 @@ answer_response(fetchctx_t *fctx) { return (result); } else if (rdataset->type == dns_rdatatype_sig && rdataset->covers == - dns_rdatatype_cname) { + dns_rdatatype_cname + && !found_type) { /* * We're looking for something else, * but we found a SIG CNAME. */ found = ISC_TRUE; + found_cname = ISC_TRUE; aflag = DNS_RDATASETATTR_ANSWERSIG; }