diff --git a/bin/named/update.c b/bin/named/update.c index 1a2f45cb4f..4ed0b6b871 100644 --- a/bin/named/update.c +++ b/bin/named/update.c @@ -796,8 +796,10 @@ static isc_result_t cname_compatibility_action(void *data, dns_rdataset_t *rrset) { UNUSED(data); if (rrset->type != dns_rdatatype_cname && - ! dns_rdatatype_isdnssec(rrset->type)) + ! dns_rdatatype_atcname(rrset->type)) + { return (ISC_R_EXISTS); + } return (ISC_R_SUCCESS); } @@ -2844,7 +2846,7 @@ update_action(isc_task_t *task, isc_event_t *event) { dns_rdatatype_cname, 0, &flag)); if (flag && - ! dns_rdatatype_isdnssec(rdata.type)) + ! dns_rdatatype_atcname(rdata.type)) { update_log(client, zone, LOGLEVEL_PROTOCOL, diff --git a/lib/dns/include/dns/rdata.h b/lib/dns/include/dns/rdata.h index 25220cea70..0e2fbf5da5 100644 --- a/lib/dns/include/dns/rdata.h +++ b/lib/dns/include/dns/rdata.h @@ -586,7 +586,6 @@ dns_rdatatype_isknown(dns_rdatatype_t type); * */ - isc_result_t dns_rdata_additionaldata(dns_rdata_t *rdata, dns_additionaldatafunc_t add, void *arg); @@ -679,6 +678,16 @@ dns_rdatatype_atparent(dns_rdatatype_t type); * */ +bool +dns_rdatatype_atcname(dns_rdatatype_t type); +/*%< + * Return true iff rdata of type 'type' can appear beside a cname. + * + * Requires: + * \li 'type' is a valid rdata type. + * + */ + unsigned int dns_rdatatype_attributes(dns_rdatatype_t rdtype); /*%< @@ -707,10 +716,12 @@ dns_rdatatype_attributes(dns_rdatatype_t rdtype); #define DNS_RDATATYPEATTR_UNKNOWN 0x00000040U /*% Is META, and can only be in a question section */ #define DNS_RDATATYPEATTR_QUESTIONONLY 0x00000080U -/*% is META, and can NOT be in a question section */ +/*% Is META, and can NOT be in a question section */ #define DNS_RDATATYPEATTR_NOTQUESTION 0x00000100U /*% Is present at zone cuts in the parent, not the child */ #define DNS_RDATATYPEATTR_ATPARENT 0x00000200U +/*% Can exist along side a CNAME */ +#define DNS_RDATATYPEATTR_ATCNAME 0x00000400U dns_rdatatype_t dns_rdata_covers(dns_rdata_t *rdata); diff --git a/lib/dns/rdata.c b/lib/dns/rdata.c index 2286b1b010..9d0adfda91 100644 --- a/lib/dns/rdata.c +++ b/lib/dns/rdata.c @@ -2299,6 +2299,14 @@ dns_rdatatype_questiononly(dns_rdatatype_t type) { return (false); } +bool +dns_rdatatype_atcname(dns_rdatatype_t type) { + if ((dns_rdatatype_attributes(type) & DNS_RDATATYPEATTR_ATCNAME) != 0) { + return (true); + } + return (false); +} + bool dns_rdatatype_atparent(dns_rdatatype_t type) { if ((dns_rdatatype_attributes(type) & DNS_RDATATYPEATTR_ATPARENT) != 0) @@ -2326,10 +2334,11 @@ dns_rdatatype_isdnssec(dns_rdatatype_t type) { bool dns_rdatatype_iszonecutauth(dns_rdatatype_t type) { - if ((dns_rdatatype_attributes(type) - & (DNS_RDATATYPEATTR_DNSSEC | DNS_RDATATYPEATTR_ZONECUTAUTH)) + if ((dns_rdatatype_attributes(type) & DNS_RDATATYPEATTR_ZONECUTAUTH) != 0) + { return (true); + } return (false); } diff --git a/lib/dns/rdata/generic/ds_43.c b/lib/dns/rdata/generic/ds_43.c index d25c1a65f1..f86bad7bd4 100644 --- a/lib/dns/rdata/generic/ds_43.c +++ b/lib/dns/rdata/generic/ds_43.c @@ -16,7 +16,8 @@ #define RDATA_GENERIC_DS_43_C #define RRTYPE_DS_ATTRIBUTES \ - (DNS_RDATATYPEATTR_DNSSEC|DNS_RDATATYPEATTR_ATPARENT) + ( DNS_RDATATYPEATTR_DNSSEC | DNS_RDATATYPEATTR_ZONECUTAUTH | \ + DNS_RDATATYPEATTR_ATPARENT ) #include #include diff --git a/lib/dns/rdata/generic/key_25.c b/lib/dns/rdata/generic/key_25.c index 6dd2eab0f2..edb02177b0 100644 --- a/lib/dns/rdata/generic/key_25.c +++ b/lib/dns/rdata/generic/key_25.c @@ -16,7 +16,8 @@ #include -#define RRTYPE_KEY_ATTRIBUTES (0) +#define RRTYPE_KEY_ATTRIBUTES \ + ( DNS_RDATATYPEATTR_ATCNAME | DNS_RDATATYPEATTR_ZONECUTAUTH ) static inline isc_result_t generic_fromtext_key(ARGS_FROMTEXT) { diff --git a/lib/dns/rdata/generic/nsec_47.c b/lib/dns/rdata/generic/nsec_47.c index 05e575b62c..0ba688cec0 100644 --- a/lib/dns/rdata/generic/nsec_47.c +++ b/lib/dns/rdata/generic/nsec_47.c @@ -18,7 +18,9 @@ * The attributes do not include DNS_RDATATYPEATTR_SINGLETON * because we must be able to handle a parent/child NSEC pair. */ -#define RRTYPE_NSEC_ATTRIBUTES (DNS_RDATATYPEATTR_DNSSEC) +#define RRTYPE_NSEC_ATTRIBUTES \ + ( DNS_RDATATYPEATTR_DNSSEC | DNS_RDATATYPEATTR_ZONECUTAUTH | \ + DNS_RDATATYPEATTR_ATCNAME ) static inline isc_result_t fromtext_nsec(ARGS_FROMTEXT) { diff --git a/lib/dns/rdata/generic/rrsig_46.c b/lib/dns/rdata/generic/rrsig_46.c index fb945ff1ed..8bc8d21f3f 100644 --- a/lib/dns/rdata/generic/rrsig_46.c +++ b/lib/dns/rdata/generic/rrsig_46.c @@ -14,7 +14,9 @@ #ifndef RDATA_GENERIC_RRSIG_46_C #define RDATA_GENERIC_RRSIG_46_C -#define RRTYPE_RRSIG_ATTRIBUTES (DNS_RDATATYPEATTR_DNSSEC) +#define RRTYPE_RRSIG_ATTRIBUTES \ + ( DNS_RDATATYPEATTR_DNSSEC | DNS_RDATATYPEATTR_ZONECUTAUTH | \ + DNS_RDATATYPEATTR_ATCNAME ) static inline isc_result_t fromtext_rrsig(ARGS_FROMTEXT) { diff --git a/lib/dns/win32/libdns.def.in b/lib/dns/win32/libdns.def.in index 62a156ce64..5c45d5920c 100644 --- a/lib/dns/win32/libdns.def.in +++ b/lib/dns/win32/libdns.def.in @@ -865,6 +865,7 @@ dns_rdataslab_merge dns_rdataslab_size dns_rdataslab_subtract dns_rdataslab_tordataset +dns_rdatatype_atcname dns_rdatatype_atparent dns_rdatatype_attributes dns_rdatatype_format