]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
pullup:
authorAndreas Gustafsson <source@isc.org>
Fri, 28 Jul 2000 22:45:52 +0000 (22:45 +0000)
committerAndreas Gustafsson <source@isc.org>
Fri, 28 Jul 2000 22:45:52 +0000 (22:45 +0000)
The server would crash if a response contained both a CNAME and records of
the query type

lib/dns/resolver.c

index bfd1ed553e7d416681f869c95a06bf93f72fd527..8e10bf6be9011338eb355aa413e2a2778f2a05a7 100644 (file)
@@ -15,7 +15,7 @@
  * SOFTWARE.
  */
 
-/* $Id: resolver.c,v 1.137.2.8 2000/07/27 21:42:14 gson Exp $ */
+/* $Id: resolver.c,v 1.137.2.9 2000/07/28 22:45:52 gson Exp $ */
 
 #include <config.h>
 
@@ -3341,7 +3341,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;
@@ -3356,6 +3356,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;
@@ -3377,11 +3379,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) {
@@ -3393,15 +3396,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.
@@ -3414,6 +3420,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,
@@ -3422,12 +3429,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;
                                }