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 8b3f8d8db0)
mr3.8.5
nils-ohlmeier 18 years ago committed by Victor Seva
parent defaf921dd
commit 41756ec4ef

@ -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);
}

Loading…
Cancel
Save