diff --git a/helper.c b/helper.c index c91ddc2..a3506f2 100644 --- a/helper.c +++ b/helper.c @@ -173,9 +173,7 @@ static const unsigned char *parse_rr(const unsigned char *aptr, const unsigned c free(name); return NULL; } - if ((ca_tmpname == NULL && type != CARES_TYPE_SRV) || - (ca_tmpname != NULL && - (type != CARES_TYPE_A && type != CARES_TYPE_CNAME))) { + if (type != CARES_TYPE_SRV && type != CARES_TYPE_A && type != CARES_TYPE_CNAME) { printf("error: unsupported DNS response type (%i)\n", type); free(name); return NULL; @@ -199,15 +197,32 @@ static const unsigned char *parse_rr(const unsigned char *aptr, const unsigned c } } else if (type == CARES_TYPE_CNAME) { - if (STRNCASECMP(ca_tmpname, name, strlen(ca_tmpname)) == 0) { + if ((ca_tmpname != NULL) && + (STRNCASECMP(ca_tmpname, name, strlen(ca_tmpname)) == 0)) { ca_tmpname = malloc(strlen(name)); if (ca_tmpname == NULL) { printf("error: failed to allocate memory\n"); exit_code(2); } strcpy(ca_tmpname, name); + free(name); + } + else { + free(name); + status = ares_expand_name(aptr, abuf, alen, &name, &len); + if (status != ARES_SUCCESS) { + printf("error: failed to expand CNAME\n"); + return NULL; + } + dbg("CNAME: %s\n", name); + if (is_ip(name)) { + caadr = inet_addr(name); + free(name); + } + else { + ca_tmpname = name; + } } - free(name); } else if (type == CARES_TYPE_A) { if (dlen == 4 && STRNCASECMP(ca_tmpname, name, strlen(ca_tmpname)) == 0) { @@ -278,7 +293,7 @@ static void cares_callback(void *arg, int status, unsigned char *abuf, int alen) else aptr = skip_rr(aptr, abuf, alen); } - if (caadr == 0) { + if (caadr == 0 && aptr != NULL) { for (i = 0; i < nscount; i++) { aptr = skip_rr(aptr, abuf, alen); }