Skip to content
Snippets Groups Projects
Commit b160d488 authored by Lubos Slovak's avatar Lubos Slovak
Browse files

Bugfixes + wildcard nodes used when adjusting zone

Fix: CNAME following was processing even the last (canonical name)
     node.
Fix: ns_put_answer() was completely omitting answers when they're
     not wildcards.

zdb_find_name_in_list() edited to accept also wildcard nodes.
parent 5a51c422
No related branches found
No related tags found
No related merge requests found
......@@ -9,7 +9,7 @@
//#define CUCKOO_DEBUG
//#define CUCKOO_DEBUG_HASH
//#define ZP_DEBUG
//#define NS_DEBUG
#define NS_DEBUG
#define ZDB_DEBUG
//#define ZN_DEBUG
//#define ZP_DEBUG_PARSE
......
......@@ -147,12 +147,14 @@ void ns_follow_cname( const zn_node **node, const ldns_rdf **qname,
cname_rr = ldns_rr_list_rr(cname_rrset, 0);
}
ldns_pkt_push_rr(response, LDNS_SECTION_ANSWER, cname_rr);
debug_ns("CNAME record for owner %s put to answer section.\n",
ldns_rdf2str(ldns_rr_owner(cname_rr)));
(*node) = zn_get_ref_cname(*node);
// save the new name which should be used for replacing wildcard
*qname = ldns_rr_rdf(cname_rr, 0);
assert(ldns_rdf_get_type(*qname) == LDNS_RDF_TYPE_DNAME);
} while (*node != NULL);
} while (*node != NULL && zn_has_cname(*node));
}
/*----------------------------------------------------------------------------*/
......@@ -163,16 +165,21 @@ static inline void ns_put_answer( const zn_node *node, const ldns_rdf *name,
ldns_rr_type type, ldns_pkt *response,
ldns_rr_list *copied_rrs )
{
debug_ns("Putting answers from node %s.\n", ldns_rdf2str(node->owner));
ldns_rr_list *rrset = zn_find_rrset(node, type);
if (ldns_dname_is_wildcard(ldns_rr_list_owner(rrset))) {
// we must copy the whole list and replace owners with name
int count = ldns_rr_list_rr_count(rrset);
for (int i = 0; i < count; ++i) {
ldns_rr *rr = ldns_rr_clone(ldns_rr_list_rr(rrset, i));
ldns_rdf_deep_free(ldns_rr_owner(rr));
ldns_rr_set_owner(rr, ldns_rdf_clone(name));
ldns_pkt_push_rr(response, LDNS_SECTION_ANSWER, rr);
ldns_rr_list_push_rr(copied_rrs, rr);
if (rrset) {
if (ldns_dname_is_wildcard(ldns_rr_list_owner(rrset))) {
// we must copy the whole list and replace owners with name
int count = ldns_rr_list_rr_count(rrset);
for (int i = 0; i < count; ++i) {
ldns_rr *rr = ldns_rr_clone(ldns_rr_list_rr(rrset, i));
ldns_rdf_deep_free(ldns_rr_owner(rr));
ldns_rr_set_owner(rr, ldns_rdf_clone(name));
ldns_pkt_push_rr(response, LDNS_SECTION_ANSWER, rr);
ldns_rr_list_push_rr(copied_rrs, rr);
}
} else {
ldns_pkt_push_rr_list(response, LDNS_SECTION_ANSWER, rrset);
}
}
ldns_pkt_set_rcode(response, LDNS_RCODE_NOERROR);
......
......@@ -184,12 +184,12 @@ zn_node *zdb_find_name_in_list( zdb_zone *zone, ldns_rdf *name )
{
zn_node *node = zone->apex;
int cmp;
while ((cmp = ldns_dname_compare(node->owner, name)) != 0
while ((cmp = ldns_dname_match_wildcard(name, node->owner)) != 1
&& node->next != zone->apex) {
node = node->next;
}
return (cmp == 0) ? node : NULL;
return (cmp == 1) ? node : NULL;
}
/*----------------------------------------------------------------------------*/
......@@ -205,7 +205,9 @@ void zdb_adjust_cname( zdb_zone *zone, zn_node *node )
debug_zdb("Canonical name for alias %s is %s\n",
ldns_rdf2str(node->owner), ldns_rdf2str(cname));
zn_set_ref_cname(node, zdb_find_name_in_list(zone, cname));
debug_zdb("Found node: %p\n\n", node->ref.cname);
debug_zdb("Found node: %s\n\n", (node->ref.cname)
? ldns_rdf2str(node->ref.cname->owner)
: "(nil)");
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment