From 41756ec4eff1c53861a917191256b15f1bbf3a3a Mon Sep 17 00:00:00 2001 From: nils-ohlmeier Date: Fri, 29 Jun 2007 10:24:28 +0000 Subject: [PATCH] fixed CNAME segfault and added SRV->CNAME resolution git-svn-id: http://svn.berlios.de/svnroot/repos/sipsak/trunk@432 75b5f7c7-cfd4-0310-b54c-e118b2c5249a (cherry picked from commit 218bd917b91fc51edd51609831d0969204851b56) (cherry picked from commit 8b3f8d8db0ba918057bf8733e5e03df44939ed8d) --- helper.c | 27 +++++++++++++++++++++------ 1 file changed, 21 insertions(+), 6 deletions(-) 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); }