diff --git a/.gitignore b/.gitignore index fc69f1c86..addcd04fc 100644 --- a/.gitignore +++ b/.gitignore @@ -43,8 +43,12 @@ /tpkg/long/result.* /tpkg/long/.done-* /tpkg/long/*.log +build/ # Eclipse IDE Project Settings .cproject .project .settings/ + +# IDEA Project settings +.idea/ diff --git a/.gitmodules b/.gitmodules index 23bd18f65..ce860d1b0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,3 +1,3 @@ [submodule "simdzone"] path = simdzone - url = https://github.com/NLnetLabs/simdzone.git + url = https://github.com/WP-Official/simdzone.git diff --git a/configure.ac b/configure.ac index b1a812d03..c078ba535 100644 --- a/configure.ac +++ b/configure.ac @@ -966,6 +966,15 @@ case "$enable_zone_stats" in ;; esac +AC_ARG_ENABLE(deleg, AS_HELP_STRING([--enable-ideleg],[Enables the use of the draft IDELEG RR type])) +case "$enable_deleg" in + yes) + AC_DEFINE_UNQUOTED([USE_IDELEG], [], [Define this to enable IDELEG draft RR type]) + ;; + no|''|*) + ;; +esac + AC_ARG_ENABLE(checking, AS_HELP_STRING([--enable-checking],[Enable internal runtime checks])) case "$enable_checking" in yes) @@ -1083,7 +1092,7 @@ AC_INCLUDES_DEFAULT #include #endif ]) - AC_CHECK_DECL([TLS1_3_VERSION], + AC_CHECK_DECL([TLS1_3_VERSION], [AC_DEFINE([HAVE_TLS_1_3], [1], [Define if TLS 1.3 is supported by OpenSSL])], [AC_MSG_WARN([No TLS 1.3, therefore XFR-over-TLS is disabled])], [[#include ]]) diff --git a/dname.c b/dname.c index a253dcbb8..7f0c2f174 100644 --- a/dname.c +++ b/dname.c @@ -618,3 +618,81 @@ is_dname_subdomain_of_case(const uint8_t* d, unsigned int len, /* The trailing portion is not at a label point. */ return 0; } + +dname_type* +label_plus_dname(const char* label, const dname_type* dname) +{ + static struct { + dname_type dname; + uint8_t bytes[MAXDOMAINLEN + 128 /* max number of labels */]; + } ATTR_PACKED name; + size_t i, ll; + + if (!label || !dname || dname->label_count > 127) + return NULL; + ll = strlen(label); + if ((int)dname->name_size + ll + 1 > MAXDOMAINLEN) + return NULL; + + /* In reversed order and first copy with memmove, so we can nest. + * i.e. label_plus_dname(label1, label_plus_dname(label2, dname)) + */ + memmove(name.bytes + dname->label_count + + 1 /* label_count increases by one */ + + 1 /* label type/length byte for label */ + ll, + ((void*)dname) + sizeof(dname_type) + dname->label_count, + dname->name_size); + memcpy(name.bytes + dname->label_count + + 1 /* label_count increases by one */ + + 1 /* label type/length byte for label */, label, ll); + name.bytes[dname->label_count + 1] = ll; /* label type/length byte */ + name.bytes[dname->label_count] = 0; /* first label follows last + * label_offsets element */ + for (i = 0; i < dname->label_count; i++) + name.bytes[i] = ((uint8_t*)(void*)dname)[sizeof(dname_type)+i] + + 1 /* label type/length byte for label */ + ll; + name.dname.label_count = dname->label_count + 1 /* label_count incr. */; + name.dname.name_size = dname->name_size + ll + + 1 /* label length */; + return &name.dname; +} + +dname_type* +labels_plus_dname(const dname_type* labels, size_t amount_to_be_copied, dname_type* dname) +{ + static struct { + dname_type dname; + uint8_t bytes[MAXDOMAINLEN + 128 /* max number of labels */]; + } ATTR_PACKED name; + size_t i; + uint8_t copied_label_size; + copied_label_size = 0; + if (!amount_to_be_copied) return dname; // If the size is 0 we return the original dname + if (!labels || !dname || dname->label_count > 127 || + amount_to_be_copied > labels->label_count) + return NULL; + + for (i = 0; i < amount_to_be_copied; i++) + { + copied_label_size += label_length(dname_label(labels, labels->label_count - i - 1)); + } + if ((int)dname->name_size + copied_label_size + 1 > MAXDOMAINLEN) + return NULL; + + name.dname.label_count = dname->label_count + amount_to_be_copied; + name.dname.name_size = dname->name_size + copied_label_size + amount_to_be_copied; + /* In reversed order and first copy with memmove, so we can nest. + * i.e. labels_plus_dname(labels1, 1,labels_plus_dname(label2, 2, dname)) + */ + memmove(name.bytes + copied_label_size + name.dname.label_count + 1, ((void*)dname) + sizeof(dname_type) + dname->label_count, dname->name_size); + memcpy(name.bytes + name.dname.label_count, + ((void*)labels) + sizeof(dname_type) + labels->label_count, + copied_label_size + amount_to_be_copied); + + + name.bytes[dname->label_count] = 0; + for (i = 0; i < dname->label_count; i++) + name.bytes[i] = ((uint8_t*)(void*)dname)[sizeof(dname_type)+i] + + copied_label_size /* label type/length byte for label */ + amount_to_be_copied; + return &name.dname; +} diff --git a/dname.h b/dname.h index fecf7510c..d0e27decd 100644 --- a/dname.h +++ b/dname.h @@ -403,4 +403,11 @@ int dname_equal_nocase(uint8_t* a, uint8_t* b, uint16_t len); int is_dname_subdomain_of_case(const uint8_t* d, unsigned int len, const uint8_t* d2, unsigned int len2); +/** return dname with label prepended to dname */ +dname_type* label_plus_dname(const char* label,const dname_type* dname); + +/** return dname with amount_of_labels from labels prepended to dname */ +dname_type* labels_plus_dname(const dname_type* labels, + size_t amount_to_be_copied, dname_type* dname); + #endif /* DNAME_H */ diff --git a/dns.c b/dns.c index dc516f514..59754f8cb 100644 --- a/dns.c +++ b/dns.c @@ -416,7 +416,7 @@ static rrtype_descriptor_type rrtype_descriptors[(RRTYPE_DESCRIPTORS_LENGTH+2)] , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM }, - { RDATA_ZF_SHORT , RDATA_ZF_DNAME + { RDATA_ZF_SHORT , RDATA_ZF_DNAME , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM @@ -922,6 +922,57 @@ static rrtype_descriptor_type rrtype_descriptors[(RRTYPE_DESCRIPTORS_LENGTH+2)] { TYPE_DLV, "DLV", 4, 4, { RDATA_WF_SHORT, RDATA_WF_BYTE, RDATA_WF_BYTE, RDATA_WF_BINARY }, { RDATA_ZF_SHORT, RDATA_ZF_ALGORITHM, RDATA_ZF_BYTE, RDATA_ZF_HEX } }, +#ifdef USE_IDELEG + /* 65280 IDELEG*/ + { TYPE_IDELEG, "IDELEG", 2, MAXRDATALEN, + { RDATA_WF_SHORT /* SvcFieldPriority */ + , RDATA_WF_UNCOMPRESSED_DNAME /* SvcDomainName */ + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM /* SvcFieldValue */ + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + , RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM, RDATA_WF_SVCPARAM + }, + { RDATA_ZF_SHORT , RDATA_ZF_DNAME + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + , RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM, RDATA_ZF_SVCPARAM + } }, +#endif }; rrtype_descriptor_type * @@ -933,6 +984,10 @@ rrtype_descriptor_by_type(uint16_t type) return &rrtype_descriptors[PSEUDO_TYPE_DLV]; else if (type == TYPE_TA) return &rrtype_descriptors[PSEUDO_TYPE_TA]; +#ifdef USE_IDELEG + else if (type == TYPE_IDELEG) + return &rrtype_descriptors[PSEUDO_TYPE_IDELEG]; +#endif return &rrtype_descriptors[0]; } diff --git a/dns.h b/dns.h index 6f8d279ca..61416a96a 100644 --- a/dns.h +++ b/dns.h @@ -175,8 +175,16 @@ typedef enum nsd_rc nsd_rc_type; #define TYPE_TA 32768 /* http://www.watson.org/~weiler/INI1999-19.pdf */ #define TYPE_DLV 32769 /* RFC 4431 */ + +#ifdef USE_IDELEG +#define TYPE_IDELEG 65280 /* IETF IDELEG draft*/ +#endif + #define PSEUDO_TYPE_TA RRTYPE_DESCRIPTORS_LENGTH #define PSEUDO_TYPE_DLV (RRTYPE_DESCRIPTORS_LENGTH + 1) +#ifdef USE_IDELEG +#define PSEUDO_TYPE_IDELEG (RRTYPE_DESCRIPTORS_LENGTH + 2) +#endif #define SVCB_KEY_MANDATORY 0 #define SVCB_KEY_ALPN 1 @@ -299,7 +307,7 @@ typedef struct rrtype_descriptor rrtype_descriptor_type; * Indexed by type. The special type "0" can be used to get a * descriptor for unknown types (with one binary rdata). * - * CLA + 1 + * IPN + 1 */ #define RRTYPE_DESCRIPTORS_LENGTH (TYPE_IPN + 1) rrtype_descriptor_type *rrtype_descriptor_by_name(const char *name); diff --git a/namedb.c b/namedb.c index 772e038b1..e6a7c1dfe 100644 --- a/namedb.c +++ b/namedb.c @@ -34,7 +34,7 @@ allocate_domain_info(domain_table_type* table, result = (domain_type *) region_alloc(table->region, sizeof(domain_type)); #ifdef USE_RADIX_TREE - result->dname + result->dname #else result->node.key #endif @@ -600,6 +600,68 @@ domain_find_ns_rrsets(domain_type* domain, zone_type* zone, rrset_type **ns) return NULL; } +#ifdef USE_IDELEG +rrset_type * +domain_find_deleg_rrsets(domain_type* delegation_domain, zone_type* zone, + namedb_type* db, domain_type** ideleg_domain, dname_type** ideleg_dname) +{ + rrset_type* result; + *ideleg_dname = labels_plus_dname(delegation_domain->dname, + delegation_domain->dname->label_count - zone->apex->dname->label_count, + label_plus_dname("_deleg", zone->apex->dname)); + *ideleg_domain = domain_table_find(db->domains, *ideleg_dname); + if (!*ideleg_domain) + return NULL; + result = domain_find_rrset(*ideleg_domain, zone, TYPE_IDELEG); + + return result; +} + +rrset_type * +domain_find_deleg_wildcard_rrsets(dname_type* ideleg_dname, zone_type* zone, + region_type* region, namedb_type* db, domain_type** wildcard_match) +{ + domain_type* closest_match; + domain_type* closest_encloser; + domain_type* wildcard_child; + domain_type* match; + namedb_lookup(db, ideleg_dname, &closest_match, &closest_encloser); + wildcard_child = domain_wildcard_child(closest_encloser); + if (!wildcard_child || !wildcard_child->is_existing) + { + return NULL; + } + match = (domain_type *) region_alloc(region, + sizeof(domain_type)); +#ifdef USE_RADIX_TREE + match->rnode = NULL; + match->dname = ideleg_dname; +#else + memcpy(&match->node, &wildcard_child->node, sizeof(rbnode_type)); + match->node.parent = NULL; +#endif + match->parent = closest_encloser; + match->wildcard_child_closest_match = match; + // match->number = domain_number; + match->rrsets = wildcard_child->rrsets; + match->is_existing = wildcard_child->is_existing; +#ifdef NSEC3 + match->nsec3 = wildcard_child->nsec3; + /* copy over these entries: + match->nsec3_is_exact = wildcard_child->nsec3_is_exact; + match->nsec3_cover = wildcard_child->nsec3_cover; + match->nsec3_wcard_child_cover = wildcard_child->nsec3_wcard_child_cover; + match->nsec3_ds_parent_is_exact = wildcard_child->nsec3_ds_parent_is_exact; + match->nsec3_ds_parent_cover = wildcard_child->nsec3_ds_parent_cover; + */ + +#endif + + *wildcard_match = match; + return domain_find_rrset(wildcard_child, zone, TYPE_IDELEG); +} +#endif + domain_type * find_dname_above(domain_type* domain, zone_type* zone) { diff --git a/namedb.h b/namedb.h index 37b4a0383..82a2e9a31 100644 --- a/namedb.h +++ b/namedb.h @@ -372,7 +372,7 @@ zone_type *namedb_find_zone(namedb_type *db, const dname_type *dname); /* * Delete a domain name from the domain table. Removes dname_info node. * Only deletes if usage is 0, has no rrsets and no children. Checks parents - * for deletion as well. Adjusts numberlist(domain.number), and + * for deletion as well. Adjusts numberlist(domain.number), and * wcard_child closest match. */ void domain_table_deldomain(namedb_type* db, domain_type* domain); @@ -474,4 +474,10 @@ void zone_rr_iter_init(zone_rr_iter_type *iter, zone_type *zone); rr_type *zone_rr_iter_next(zone_rr_iter_type *iter); +#ifdef USE_IDELEG +rrset_type *domain_find_deleg_rrsets(domain_type* delegation_domain, zone_type* zone, namedb_type* db, domain_type **ideleg_domain, dname_type **ideleg_dname); + +rrset_type *domain_find_deleg_wildcard_rrsets(dname_type* ideleg_dname, zone_type* zone, region_type* region, namedb_type* db, domain_type** wildcard_match); +#endif + #endif /* NAMEDB_H */ diff --git a/nsec3.c b/nsec3.c index 9e17e6d65..fc0bdbf08 100644 --- a/nsec3.c +++ b/nsec3.c @@ -360,7 +360,7 @@ hash_tree_clear(rbtree_type* tree) * then mean setting the key value of the nodes to NULL to indicate * absence of the prehash. * But since prehash structs are separatly allocated, this is no longer - * necessary as currently the prehash structs are simply recycled and + * necessary as currently the prehash structs are simply recycled and * NULLed. * * rbnode_type* n; diff --git a/query.c b/query.c index 6c7869c27..3d5f2d1a3 100644 --- a/query.c +++ b/query.c @@ -918,8 +918,12 @@ query_synthesize_cname(struct query* q, struct answer* answer, const dname_type* * record proving the DS RRset does not exist. */ static void -answer_delegation(query_type *query, answer_type *answer) +answer_delegation(query_type *query, answer_type *answer, const struct nsd* nsd) { + rrset_type *rrset; +#ifdef USE_IDELEG + dname_type* ideleg_dname; +#endif assert(answer); assert(query->delegation_domain); assert(query->delegation_rrset); @@ -935,8 +939,76 @@ answer_delegation(query_type *query, answer_type *answer) AUTHORITY_SECTION, query->delegation_domain, query->delegation_rrset); +#ifdef USE_IDELEG + if ((rrset = domain_find_deleg_rrsets(query->delegation_domain, query->zone, nsd->db, &query->ideleg_domain, &ideleg_dname))) + { + add_rrset(query, answer, AUTHORITY_SECTION, + query->ideleg_domain, rrset); + } + else if (!query->edns.dnssec_ok || !zone_is_secure(query->zone)){} +#ifdef NSEC3 + else if (query->zone->nsec3_param) + { + if (query->ideleg_domain) + { + if ((rrset = domain_find_rrset(query->ideleg_domain->nsec3->nsec3_cover, query->zone, TYPE_NSEC3))) + { + add_rrset(query, answer, AUTHORITY_SECTION, + query->ideleg_domain->nsec3->nsec3_cover, rrset); + } + } + else + { + domain_type* ideleg_closest_match; + domain_type* ideleg_encloser; + domain_type* ideleg_next_closer; + const dname_type* to_prove; + uint8_t hash[NSEC3_HASH_LEN]; + + namedb_lookup(nsd->db, ideleg_dname, &ideleg_closest_match, &ideleg_encloser); + to_prove = dname_partial_copy(query->region, ideleg_dname, + dname_label_match_count(ideleg_dname, domain_dname(ideleg_encloser))+1); + nsec3_hash_and_store(query->zone, to_prove, hash); + nsec3_find_cover(query->zone, hash, sizeof(hash), &ideleg_next_closer); + + if ((rrset = domain_find_rrset(ideleg_next_closer, query->zone, TYPE_NSEC3))) + { + add_rrset(query, answer, AUTHORITY_SECTION, + ideleg_next_closer, rrset); + } + if ((rrset = domain_find_rrset(ideleg_encloser->nsec3->nsec3_cover, query->zone, TYPE_NSEC3))) + { + add_rrset(query, answer, AUTHORITY_SECTION, + ideleg_encloser->nsec3->nsec3_cover, rrset); + } + } + } +#endif + else if (!query->ideleg_domain) + { + domain_type* ideleg_closest_match; + domain_type* ideleg_encloser; + namedb_lookup(nsd->db, ideleg_dname, &ideleg_closest_match, &ideleg_encloser);; + find_covering_nsec(ideleg_closest_match, query->zone, &rrset); + + if (rrset) + { + add_rrset(query, answer, AUTHORITY_SECTION, + ideleg_closest_match, rrset); + } + if ((rrset = domain_find_rrset(ideleg_encloser, query->zone, TYPE_NSEC))) + { + add_rrset(query, answer, AUTHORITY_SECTION, + ideleg_encloser, rrset); + } + } + else if ((rrset = domain_find_rrset(query->ideleg_domain, query->zone, TYPE_NSEC))) + { + add_rrset(query, answer, AUTHORITY_SECTION, + query->ideleg_domain, rrset); + } +#endif if (query->edns.dnssec_ok && zone_is_secure(query->zone)) { - rrset_type *rrset; if ((rrset = domain_find_rrset(query->delegation_domain, query->zone, TYPE_DS))) { add_rrset(query, answer, AUTHORITY_SECTION, query->delegation_domain, rrset); @@ -1506,7 +1578,7 @@ answer_lookup_zone(struct nsd *nsd, struct query *q, answer_type *answer, closest_match, closest_encloser, qname); } else { - answer_delegation(q, answer); + answer_delegation(q, answer, nsd); } } } diff --git a/query.h b/query.h index de8e1934b..65cc49d40 100644 --- a/query.h +++ b/query.h @@ -161,6 +161,11 @@ struct query { /* if we encountered a wildcard, its domain */ domain_type *wildcard_domain; #endif + +#ifdef USE_IDELEG + /* if we encountered an ideleg domain, it will be here */ + domain_type *ideleg_domain; +#endif }; diff --git a/simdzone b/simdzone index 80f5f44df..d720518a7 160000 --- a/simdzone +++ b/simdzone @@ -1 +1 @@ -Subproject commit 80f5f44dfeb9878b5559b0bfbdd75a077ce92f3e +Subproject commit d720518a774bc14e5b05d074e1ebb534e94553e0 diff --git a/xfrd-catalog-zones.c b/xfrd-catalog-zones.c index 7aee82fcd..abc540684 100644 --- a/xfrd-catalog-zones.c +++ b/xfrd-catalog-zones.c @@ -26,9 +26,6 @@ static void vmake_catalog_consumer_invalid( struct xfrd_catalog_consumer_zone *consumer_zone, const char *format, va_list args); -/** return (static) dname with label prepended to dname */ -static dname_type* label_plus_dname(const char* label,const dname_type* dname); - /** delete the catalog member zone */ static void catalog_del_consumer_member_zone( struct xfrd_catalog_consumer_zone* consumer_zone, @@ -303,44 +300,6 @@ make_catalog_consumer_valid(struct xfrd_catalog_consumer_zone *consumer_zone) } } -static dname_type* -label_plus_dname(const char* label, const dname_type* dname) -{ - static struct { - dname_type dname; - uint8_t bytes[MAXDOMAINLEN + 128 /* max number of labels */]; - } ATTR_PACKED name; - size_t i, ll; - - if (!label || !dname || dname->label_count > 127) - return NULL; - ll = strlen(label); - if ((int)dname->name_size + ll + 1 > MAXDOMAINLEN) - return NULL; - - /* In reversed order and first copy with memmove, so we can nest. - * i.e. label_plus_dname(label1, label_plus_dname(label2, dname)) - */ - memmove(name.bytes + dname->label_count - + 1 /* label_count increases by one */ - + 1 /* label type/length byte for label */ + ll, - ((char*)dname) + sizeof(dname_type) + dname->label_count, - dname->name_size); - memcpy(name.bytes + dname->label_count - + 1 /* label_count increases by one */ - + 1 /* label type/length byte for label */, label, ll); - name.bytes[dname->label_count + 1] = ll; /* label type/length byte */ - name.bytes[dname->label_count] = 0; /* first label follows last - * label_offsets element */ - for (i = 0; i < dname->label_count; i++) - name.bytes[i] = ((uint8_t*)(void*)dname)[sizeof(dname_type)+i] - + 1 /* label type/length byte for label */ + ll; - name.dname.label_count = dname->label_count + 1 /* label_count incr. */; - name.dname.name_size = dname->name_size + ll - + 1 /* label length */; - return &name.dname; -} - static void catalog_del_consumer_member_zone( struct xfrd_catalog_consumer_zone* consumer_zone, @@ -420,7 +379,7 @@ const char *invalid_catalog_consumer_zone(struct zone_options* zone) if (!zone || !zone_is_catalog_consumer(zone)) msg = NULL; - else if (!xfrd) + else if (!xfrd) msg = "asked for catalog information outside of xfrd process"; else if (!xfrd->catalog_consumer_zones) @@ -596,7 +555,7 @@ xfrd_process_catalog_consumer_zone( * NOT be processed (see Section 5.1). */ if (rrset->rr_count != 1) { - make_catalog_consumer_invalid(consumer_zone, + make_catalog_consumer_invalid(consumer_zone, "only a single PTR RR expected on '%s'", domain_to_string(member_id)); return; @@ -671,7 +630,7 @@ xfrd_process_catalog_consumer_zone( else if (!(pattern = default_pattern = catalog_member_pattern(consumer_zone))) { - make_catalog_consumer_invalid(consumer_zone, + make_catalog_consumer_invalid(consumer_zone, "missing 'group.%s' TXT RR and no default " "pattern from \"catalog-member-pattern\"", domain_to_string(member_id)); @@ -692,7 +651,7 @@ xfrd_process_catalog_consumer_zone( dname_to_string(cursor_member_id(cursor), NULL))); - while (cursor != RBTREE_NULL && + while (cursor != RBTREE_NULL && (cmp = dname_compare( domain_dname(member_id), cursor_member_id(cursor))) > 0) { @@ -764,7 +723,7 @@ xfrd_process_catalog_consumer_zone( #endif /* It is a catalog consumer member, * so no need to check if it was a - * catalog producer member zone to + * catalog producer member zone to * delete and add */ zopt->pattern = pattern; @@ -1103,7 +1062,7 @@ try_buffer_write_TXT(buffer_type* packet, const dname_type* name, return 1; } buffer_set_position(packet, mark); - return 0; + return 0; } static void @@ -1199,7 +1158,7 @@ xfrd_process_catalog_producer_zone( xfr_writer_add_TXT(&xw, label_plus_dname("version" , producer_name), "2"); goto add_member_zones; - } + } /* IXFR */ xfr_writer_add_SOA(&xw, producer_name, xw.old_serial); while(producer_zone->to_delete) { @@ -1282,4 +1241,3 @@ void xfrd_process_catalog_producer_zones() xfrd_process_catalog_producer_zone(producer_zone); } } -