From daf3049e1efd72d5565cc2165cdc67ceffbcd3fb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ond=C5=99ej=20Sur=C3=BD?= Date: Sat, 14 Jul 2018 10:55:39 -0400 Subject: [PATCH] Allow CNAME at apex with SOA, NS and DNAME --- lib/dns/rbtdb.c | 33 ++++++++++++++++++++++----------- 1 file changed, 22 insertions(+), 11 deletions(-) diff --git a/lib/dns/rbtdb.c b/lib/dns/rbtdb.c index e332802fc3..c3c0ca2603 100644 --- a/lib/dns/rbtdb.c +++ b/lib/dns/rbtdb.c @@ -4101,8 +4101,13 @@ zone_find(dns_db_t *db, const dns_name_t *name, dns_dbversion_t *version, * We don't check for RRSIG, because we don't store RRSIG records * directly. */ - if (type == dns_rdatatype_key || type == dns_rdatatype_nsec) + if (type == dns_rdatatype_key || + type == dns_rdatatype_nsec || + type == dns_rdatatype_soa || + type == dns_rdatatype_ns) + { cname_ok = ISC_FALSE; + } /* * We now go looking for rdata... @@ -5858,7 +5863,11 @@ cname_and_other_data(dns_rbtnode_t *node, rbtdb_serial_t serial) { if (rdtype != dns_rdatatype_key && rdtype != dns_rdatatype_sig && rdtype != dns_rdatatype_nsec && - rdtype != dns_rdatatype_rrsig) { + rdtype != dns_rdatatype_rrsig && + rdtype != dns_rdatatype_dname && + rdtype != dns_rdatatype_soa && + rdtype != dns_rdatatype_ns) + { /* * Is it active and extant? */ @@ -5869,22 +5878,23 @@ cname_and_other_data(dns_rbtnode_t *node, rbtdb_serial_t serial) { * Is this a "this rdataset * doesn't exist" record? */ - if (NONEXISTENT(header)) + if (NONEXISTENT(header)) { header = NULL; + } else { + header = header->down; + } break; - } else - header = header->down; + } + header = header->down; } while (header != NULL); - if (header != NULL) + if (header != NULL) { other_data = ISC_TRUE; + } } } } - if (cname && other_data) - return (ISC_TRUE); - - return (ISC_FALSE); + return (ISC_TF(cname && other_data)); } static isc_result_t @@ -6460,8 +6470,9 @@ add32(dns_rbtdb_t *rbtdb, dns_rbtnode_t *rbtnode, rbtdb_version_t *rbtversion, * Check if the node now contains CNAME and other data. */ if (rbtversion != NULL && - cname_and_other_data(rbtnode, rbtversion->serial)) + cname_and_other_data(rbtnode, rbtversion->serial)) { return (DNS_R_CNAMEANDOTHER); + } if (addedrdataset != NULL) bind_rdataset(rbtdb, rbtnode, newheader, now, addedrdataset);