diff --git a/smmapdfw/libsmmapdfw/htdns.c b/smmapdfw/libsmmapdfw/htdns.c index f4875bc..775af7f 100644 --- a/smmapdfw/libsmmapdfw/htdns.c +++ b/smmapdfw/libsmmapdfw/htdns.c @@ -298,7 +298,7 @@ static void** get_rrs(char *domain, int qtype) { cnt = sizeof(HEADER); -#if 0 +#if 1 syslog(LOG_DEBUG, "id: %d\n", answer->hdr.id); syslog(LOG_DEBUG, "qr: %d\n", answer->hdr.qr); syslog(LOG_DEBUG, "oc: %d\n", answer->hdr.opcode); @@ -334,6 +334,7 @@ static void** get_rrs(char *domain, int qtype) { //if (type != qtype) // printf("answer type mismatch: %d != %d\n", type, qtype); /* assert(type==qtype); */ + cnt += 2; class = get16(answer->buf, cnt); cnt += 2; @@ -368,8 +369,14 @@ mx_rdata_t** get_mx_rrs(char *domain) { rdata_t **rdata = (rdata_t**) get_rrs(domain, T_MX); - if ((NULL == rdata) || (NULL == *rdata)) + if (NULL == rdata) { return NULL; + } + + if (NULL == *rdata) { + free(rdata); + return NULL; + } rdata_t **rdata2; mx_rdata_t **mx_rdata = NULL; @@ -389,32 +396,49 @@ mx_rdata_t** get_mx_rrs(char *domain) { free(rdata); /* terminate the new container */ - *((int**)(mx_rdata + i)) = NULL; + if (mx_rdata != NULL) + *((int**)(mx_rdata + i)) = NULL; return mx_rdata; } -a_rdata_t** get_a_rrs(char *domain) { + + +a_rdata_t** inner_get_a_rrs(char *domain, int *depth) { + printf("depth: %d, domain: %s\n", *depth, domain); + if (*depth > 5) { + printf("loop\n"); + return NULL; + } if (domain == NULL) return NULL; cname_rdata_t **cname_rdata; rdata_t **rdata = (rdata_t**) get_rrs(domain, T_A); - if ((NULL == rdata) || (NULL == *rdata)) + + if (NULL == rdata) { return NULL; + } + + if (NULL == *rdata) { + free(rdata); + return NULL; + } rdata_t **rdata2; a_rdata_t **a_rdata = NULL; int i = 0; // one for the termination for (rdata2 = rdata; *rdata2 != NULL; rdata2++) { + printf(" depth: %d, rdata2: %p\n", *depth, rdata2); if ((*rdata2)->type == T_A) { a_rdata = (a_rdata_t**) htrealloc(a_rdata, sizeof(a_rdata_t*) * (i + 2)); *(a_rdata + i) = *rdata2; i++; } else if ((*rdata2)->type == T_CNAME) { cname_rdata_t *cname_rdata = (cname_rdata_t*) *rdata2; - a_rdata_t **a_rdata_recurse = get_a_rrs(cname_rdata->cname); + (*depth)++; + a_rdata_t **a_rdata_recurse = inner_get_a_rrs(cname_rdata->cname, depth); if ((NULL != a_rdata_recurse) && (NULL != *a_rdata_recurse)) { a_rdata_t **a_rdata2; for (a_rdata2 = a_rdata_recurse; *a_rdata2 != NULL; a_rdata2++) { @@ -423,7 +447,10 @@ a_rdata_t** get_a_rrs(char *domain) { i++; } free(a_rdata_recurse); + } else if (NULL != a_rdata_recurse) { + free(a_rdata_recurse); } + free_rdata(cname_rdata); } else { /* it's not, free it */ free_rdata(*rdata2); @@ -434,12 +461,18 @@ a_rdata_t** get_a_rrs(char *domain) { free(rdata); /* terminate the new container */ - *((int**)(a_rdata + i)) = NULL; + if (a_rdata != NULL) + *((int**)(a_rdata + i)) = NULL; return a_rdata; } +a_rdata_t** get_a_rrs(char *domain) { + int i = 0; + return inner_get_a_rrs(domain, &i); +} + #define min(A,B) ((A