]> git.ipfire.org Git - thirdparty/bind9.git/commitdiff
3952. [bug] dns_name_fullcompare failed to set *nlabelsp when the
authorMark Andrews <marka@isc.org>
Sat, 27 Sep 2014 01:41:44 +0000 (11:41 +1000)
committerMark Andrews <marka@isc.org>
Sat, 27 Sep 2014 01:41:44 +0000 (11:41 +1000)
                        two name pointers were the same. [RT #37176]

CHANGES
lib/dns/name.c
lib/dns/tests/Makefile.in
lib/dns/tests/name_test.c [new file with mode: 0644]

diff --git a/CHANGES b/CHANGES
index fbb5c0e1f3cd1a2b7caf820ce0ae8fc581ab1091..edb68f9eb09b9583460a9e0ae7575b5727e0e6af 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -1,3 +1,6 @@
+3952.  [bug]           dns_name_fullcompare failed to set *nlabelsp when the
+                       two name pointers were the same. [RT #37176]
+
 3951.  [func]          Add the ability to set yet-to-be-defined EDNS flags
                        to dig (+ednsflags=#). [RT #37142]
 
index af4cb044fcf23973e556411ecd99ba1831c78d25..9b2c6b3d98ba0d2cd4feecad400aad626cf0047f 100644 (file)
@@ -619,6 +619,7 @@ dns_name_fullcompare(const dns_name_t *name1, const dns_name_t *name2,
 
        if (name1 == name2) {
                *orderp = 0;
+               *nlabelsp = name1->labels;
                return (dns_namereln_equal);
        }
 
index 86e11df78144915c32bf5a58a6f2b1c6a992253d..559979a0e4c96819656ff2cf2ae6c48a8a44d9bf 100644 (file)
@@ -47,6 +47,7 @@ SRCS =                db_test.c \
                gost_test.c \
                keytable_test.c \
                master_test.c \
+               name_test.c \
                nsec3_test.c \
                peer_test.c \
                private_test.c \
@@ -70,6 +71,7 @@ TARGETS =     db_test@EXEEXT@ \
                gost_test@EXEEXT@ \
                keytable_test@EXEEXT@ \
                master_test@EXEEXT@ \
+               name_test@EXEEXT@ \
                nsec3_test@EXEEXT@ \
                peer_test@EXEEXT@ \
                private_test@EXEEXT@ \
@@ -149,6 +151,11 @@ zt_test@EXEEXT@: zt_test.@O@ dnstest.@O@ \
                        zt_test.@O@ dnstest.@O@ ${DNSLIBS} \
                                ${ISCLIBS} ${LIBS}
 
+name_test@EXEEXT@: name_test.@O@ dnstest.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
+       ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
+                       name_test.@O@ dnstest.@O@ ${DNSLIBS} \
+                               ${ISCLIBS} ${LIBS}
+
 nsec3_test@EXEEXT@: nsec3_test.@O@ dnstest.@O@ ${ISCDEPLIBS} ${DNSDEPLIBS}
        ${LIBTOOL_MODE_LINK} ${PURIFY} ${CC} ${CFLAGS} ${LDFLAGS} -o $@ \
                        nsec3_test.@O@ dnstest.@O@ ${DNSLIBS} \
diff --git a/lib/dns/tests/name_test.c b/lib/dns/tests/name_test.c
new file mode 100644 (file)
index 0000000..ec264fe
--- /dev/null
@@ -0,0 +1,128 @@
+/*
+ * Copyright (C) 2012, 2014  Internet Systems Consortium, Inc. ("ISC")
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
+ * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
+ * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
+ * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
+ * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
+ * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+/* $Id$ */
+
+/*! \file */
+
+#include <config.h>
+
+#include <atf-c.h>
+
+#include <unistd.h>
+
+#include <dns/name.h>
+#include <dns/fixedname.h>
+#include "dnstest.h"
+
+/*
+ * Individual unit tests
+ */
+
+ATF_TC(fullcompare);
+ATF_TC_HEAD(fullcompare, tc) {
+       atf_tc_set_md_var(tc, "descr", "dns_name_fullcompare test");
+}
+ATF_TC_BODY(fullcompare, tc) {
+       dns_fixedname_t fixed1;
+       dns_fixedname_t fixed2;
+       dns_name_t *name1;
+       dns_name_t *name2;
+       dns_namereln_t relation;
+       int i;
+       isc_result_t result;
+       struct {
+               const char *name1;
+               const char *name2;
+               dns_namereln_t relation;
+               int order;
+               unsigned int nlabels;
+       } data[] = {
+               /* relative */
+               { "", "", dns_namereln_equal, 0, 0 },
+               { "foo", "", dns_namereln_subdomain, 1, 0 },
+               { "", "foo", dns_namereln_contains, -1, 0 },
+               { "foo", "bar", dns_namereln_none, 4, 0 },
+               { "bar", "foo", dns_namereln_none, -4, 0 },
+               { "bar.foo", "foo", dns_namereln_subdomain, 1, 1 },
+               { "foo", "bar.foo", dns_namereln_contains, -1, 1 },
+               { "baz.bar.foo", "bar.foo", dns_namereln_subdomain, 1, 2 },
+               { "bar.foo", "baz.bar.foo", dns_namereln_contains, -1, 2 },
+               { "foo.example", "bar.example", dns_namereln_commonancestor,
+                 4, 1 },
+
+               /* absolute */
+               { ".", ".", dns_namereln_equal, 0, 1 },
+               { "foo.", "bar.", dns_namereln_commonancestor, 4, 1 },
+               { "bar.", "foo.", dns_namereln_commonancestor, -4, 1 },
+               { "foo.example.", "bar.example.", dns_namereln_commonancestor,
+                 4, 2 },
+               { "bar.foo.", "foo.", dns_namereln_subdomain, 1, 2 },
+               { "foo.", "bar.foo.", dns_namereln_contains, -1, 2 },
+               { "baz.bar.foo.", "bar.foo.", dns_namereln_subdomain, 1, 3 },
+               { "bar.foo.", "baz.bar.foo.", dns_namereln_contains, -1, 3 },
+               { NULL, NULL, dns_namereln_none, 0, 0 }
+       };
+
+       UNUSED(tc);
+
+       dns_fixedname_init(&fixed1);
+       name1 = dns_fixedname_name(&fixed1);
+       dns_fixedname_init(&fixed2);
+       name2 = dns_fixedname_name(&fixed2);
+       for (i = 0; data[i].name1 != NULL; i++) {
+               int order = 3000;
+               unsigned int nlabels = 3000;
+
+               if (data[i].name1[0] == 0) {
+                       dns_fixedname_init(&fixed1);
+               } else {
+                       result = dns_name_fromstring2(name1, data[i].name1,
+                                                     NULL, 0, NULL);
+                       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+               }
+               if (data[i].name2[0] == 0) {
+                       dns_fixedname_init(&fixed2);
+               } else {
+                       result = dns_name_fromstring2(name2, data[i].name2,
+                                                     NULL, 0, NULL);
+                       ATF_REQUIRE_EQ(result, ISC_R_SUCCESS);
+               }
+               relation = dns_name_fullcompare(name1, name1, &order, &nlabels);
+               ATF_REQUIRE_EQ(relation, dns_namereln_equal);
+               ATF_REQUIRE_EQ(order, 0);
+               ATF_REQUIRE_EQ(nlabels, name1->labels);
+
+               /* Some random initializer */
+               order = 3001;
+               nlabels = 3001;
+
+               relation = dns_name_fullcompare(name1, name2, &order, &nlabels);
+               ATF_REQUIRE_EQ(relation, data[i].relation);
+               ATF_REQUIRE_EQ(order, data[i].order);
+               ATF_REQUIRE_EQ(nlabels, data[i].nlabels);
+       }
+}
+
+/*
+ * Main
+ */
+ATF_TP_ADD_TCS(tp) {
+       ATF_TP_ADD_TC(tp, fullcompare);
+
+       return (atf_no_error());
+}
+