@@ -438,9 +438,12 @@ rdns_parse_rr (struct rdns_resolver *resolver, | |||
parsed = true; | |||
break; | |||
case DNS_T_CNAME: | |||
/* Skip cname records */ | |||
p += datalen; | |||
*remain -= datalen; | |||
if (! rdns_parse_labels (resolver, in, &elt->content.cname.name, &p, | |||
rep, remain, true)) { | |||
rdns_info ("invalid labels in CNAME record; domain %s", rep->requested_name); | |||
return -1; | |||
} | |||
parsed = true; | |||
break; | |||
default: | |||
rdns_info ("unexpected RR type: %d; domain %s", type, rep->requested_name); |
@@ -48,6 +48,7 @@ enum rdns_request_type { | |||
RDNS_REQUEST_INVALID = -1, | |||
RDNS_REQUEST_A = 1, | |||
RDNS_REQUEST_NS = 2, | |||
RDNS_REQUEST_CNAME = 5, | |||
RDNS_REQUEST_SOA = 6, | |||
RDNS_REQUEST_PTR = 12, | |||
RDNS_REQUEST_MX = 15, | |||
@@ -101,6 +102,9 @@ union rdns_reply_element_un { | |||
uint16_t datalen; | |||
uint8_t *data; | |||
} tlsa; | |||
struct { | |||
char *name; | |||
} cname; | |||
}; | |||
struct rdns_reply_entry { |
@@ -457,6 +457,9 @@ rdns_reply_free (struct rdns_reply *rep) | |||
free (entry->content.soa.mname); | |||
free (entry->content.soa.admin); | |||
break; | |||
case RDNS_REQUEST_CNAME: | |||
free(entry->content.cname.name); | |||
break; | |||
default: | |||
break; | |||
} |