]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
357. [bug] The server would crash if a response contained both
authorBrian Wellington <source@isc.org>
Fri, 28 Jul 2000 22:37:47 +0000 (22:37 +0000)
committerBrian Wellington <source@isc.org>
Fri, 28 Jul 2000 22:37:47 +0000 (22:37 +0000)
                        a CNAME and records of the query type.

CHANGES
lib/dns/resolver.c

diff --git a/CHANGES b/CHANGES
index cd1e21a1c633dd90a689b7171f31af6185d1369d..1cc0a5161bdf965df6509a3cfdcb437a34678e9f 100644 (file)
--- 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.
 
index bc66bc58626f6e5ac01ce661d2cdd4101d15cf02..084975ebae401255ec3645f9db07f30a341c4d31 100644 (file)
@@ -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;
                                }