cname loop detection
This commit is contained in:
parent
0ca1109cc8
commit
d8144b6969
@ -298,7 +298,7 @@ static void** get_rrs(char *domain, int qtype) {
|
|||||||
|
|
||||||
cnt = sizeof(HEADER);
|
cnt = sizeof(HEADER);
|
||||||
|
|
||||||
#if 0
|
#if 1
|
||||||
syslog(LOG_DEBUG, "id: %d\n", answer->hdr.id);
|
syslog(LOG_DEBUG, "id: %d\n", answer->hdr.id);
|
||||||
syslog(LOG_DEBUG, "qr: %d\n", answer->hdr.qr);
|
syslog(LOG_DEBUG, "qr: %d\n", answer->hdr.qr);
|
||||||
syslog(LOG_DEBUG, "oc: %d\n", answer->hdr.opcode);
|
syslog(LOG_DEBUG, "oc: %d\n", answer->hdr.opcode);
|
||||||
@ -334,6 +334,7 @@ static void** get_rrs(char *domain, int qtype) {
|
|||||||
//if (type != qtype)
|
//if (type != qtype)
|
||||||
// printf("answer type mismatch: %d != %d\n", type, qtype);
|
// printf("answer type mismatch: %d != %d\n", type, qtype);
|
||||||
/* assert(type==qtype); */
|
/* assert(type==qtype); */
|
||||||
|
|
||||||
cnt += 2;
|
cnt += 2;
|
||||||
class = get16(answer->buf, cnt);
|
class = get16(answer->buf, cnt);
|
||||||
cnt += 2;
|
cnt += 2;
|
||||||
@ -368,8 +369,14 @@ mx_rdata_t** get_mx_rrs(char *domain) {
|
|||||||
|
|
||||||
rdata_t **rdata = (rdata_t**) get_rrs(domain, T_MX);
|
rdata_t **rdata = (rdata_t**) get_rrs(domain, T_MX);
|
||||||
|
|
||||||
if ((NULL == rdata) || (NULL == *rdata))
|
if (NULL == rdata) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == *rdata) {
|
||||||
|
free(rdata);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
rdata_t **rdata2;
|
rdata_t **rdata2;
|
||||||
mx_rdata_t **mx_rdata = NULL;
|
mx_rdata_t **mx_rdata = NULL;
|
||||||
@ -389,32 +396,49 @@ mx_rdata_t** get_mx_rrs(char *domain) {
|
|||||||
free(rdata);
|
free(rdata);
|
||||||
|
|
||||||
/* terminate the new container */
|
/* terminate the new container */
|
||||||
|
if (mx_rdata != NULL)
|
||||||
*((int**)(mx_rdata + i)) = NULL;
|
*((int**)(mx_rdata + i)) = NULL;
|
||||||
|
|
||||||
return mx_rdata;
|
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)
|
if (domain == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
cname_rdata_t **cname_rdata;
|
cname_rdata_t **cname_rdata;
|
||||||
|
|
||||||
rdata_t **rdata = (rdata_t**) get_rrs(domain, T_A);
|
rdata_t **rdata = (rdata_t**) get_rrs(domain, T_A);
|
||||||
if ((NULL == rdata) || (NULL == *rdata))
|
|
||||||
|
if (NULL == rdata) {
|
||||||
return NULL;
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (NULL == *rdata) {
|
||||||
|
free(rdata);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
rdata_t **rdata2;
|
rdata_t **rdata2;
|
||||||
a_rdata_t **a_rdata = NULL;
|
a_rdata_t **a_rdata = NULL;
|
||||||
int i = 0; // one for the termination
|
int i = 0; // one for the termination
|
||||||
for (rdata2 = rdata; *rdata2 != NULL; rdata2++) {
|
for (rdata2 = rdata; *rdata2 != NULL; rdata2++) {
|
||||||
|
printf(" depth: %d, rdata2: %p\n", *depth, rdata2);
|
||||||
if ((*rdata2)->type == T_A) {
|
if ((*rdata2)->type == T_A) {
|
||||||
a_rdata = (a_rdata_t**) htrealloc(a_rdata, sizeof(a_rdata_t*) * (i + 2));
|
a_rdata = (a_rdata_t**) htrealloc(a_rdata, sizeof(a_rdata_t*) * (i + 2));
|
||||||
*(a_rdata + i) = *rdata2;
|
*(a_rdata + i) = *rdata2;
|
||||||
i++;
|
i++;
|
||||||
} else if ((*rdata2)->type == T_CNAME) {
|
} else if ((*rdata2)->type == T_CNAME) {
|
||||||
cname_rdata_t *cname_rdata = (cname_rdata_t*) *rdata2;
|
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)) {
|
if ((NULL != a_rdata_recurse) && (NULL != *a_rdata_recurse)) {
|
||||||
a_rdata_t **a_rdata2;
|
a_rdata_t **a_rdata2;
|
||||||
for (a_rdata2 = a_rdata_recurse; *a_rdata2 != NULL; 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++;
|
i++;
|
||||||
}
|
}
|
||||||
free(a_rdata_recurse);
|
free(a_rdata_recurse);
|
||||||
|
} else if (NULL != a_rdata_recurse) {
|
||||||
|
free(a_rdata_recurse);
|
||||||
}
|
}
|
||||||
|
free_rdata(cname_rdata);
|
||||||
} else {
|
} else {
|
||||||
/* it's not, free it */
|
/* it's not, free it */
|
||||||
free_rdata(*rdata2);
|
free_rdata(*rdata2);
|
||||||
@ -434,12 +461,18 @@ a_rdata_t** get_a_rrs(char *domain) {
|
|||||||
free(rdata);
|
free(rdata);
|
||||||
|
|
||||||
/* terminate the new container */
|
/* terminate the new container */
|
||||||
|
if (a_rdata != NULL)
|
||||||
*((int**)(a_rdata + i)) = NULL;
|
*((int**)(a_rdata + i)) = NULL;
|
||||||
|
|
||||||
return a_rdata;
|
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<B) ? A : B)
|
#define min(A,B) ((A<B) ? A : B)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user