mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-31 06:25:31 +00:00
357. [bug] The server would crash if a response contained both
a CNAME and records of the query type.
This commit is contained in:
3
CHANGES
3
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.
|
||||
|
||||
|
@@ -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 <config.h>
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user