cname: fix cname rule loop issue.

This commit is contained in:
Nick Peng
2023-04-17 23:21:41 +08:00
parent 6ca3bfdf36
commit 54d95609bd
3 changed files with 154 additions and 2 deletions

View File

@@ -311,6 +311,8 @@ struct dns_request {
int no_select_possible_ip;
int no_cache_cname;
int no_cache;
int has_cname_loop;
};
/* dns server data */
@@ -4228,6 +4230,10 @@ static int _dns_server_process_cname_pre(struct dns_request *request)
return 0;
}
if (request->has_cname_loop == 1) {
return 0;
}
/* get domain rule flag */
rule_flag = _dns_server_get_dns_rule(request, DOMAIN_RULE_FLAGS);
if (rule_flag != NULL) {
@@ -4267,6 +4273,10 @@ static int _dns_server_process_cname(struct dns_request *request)
return 0;
}
if (request->has_cname_loop == 1) {
return 0;
}
/* get domain rule flag */
rule_flag = _dns_server_get_dns_rule(request, DOMAIN_RULE_FLAGS);
if (rule_flag != NULL) {
@@ -4289,6 +4299,33 @@ static int _dns_server_process_cname(struct dns_request *request)
return -1;
}
/* check cname rule loop */
struct dns_request *check_request = child_request->parent_request;
struct dns_cname_rule *child_cname = _dns_server_get_dns_rule(child_request, DOMAIN_RULE_CNAME);
/* sub domain rule*/
if (child_cname != NULL && strncmp(child_request->domain, child_cname->cname, DNS_MAX_CNAME_LEN) == 0) {
child_request->domain_rule.rules[DOMAIN_RULE_CNAME] = NULL;
child_request->has_cname_loop = 1;
}
/* loop rule */
while (check_request != NULL && child_cname != NULL) {
struct dns_cname_rule *check_cname = _dns_server_get_dns_rule(check_request, DOMAIN_RULE_CNAME);
if (check_cname == NULL) {
break;
}
if (strstr(child_request->domain, check_request->domain) != NULL &&
check_request != child_request->parent_request) {
child_request->domain_rule.rules[DOMAIN_RULE_CNAME] = NULL;
child_request->has_cname_loop = 1;
break;
}
check_request = check_request->parent_request;
}
child_group_name = _dns_server_get_request_groupname(child_request);
if (child_group_name) {
/* reset dns group and setup child request domain group again when do query.*/
@@ -5029,6 +5066,7 @@ static int _dns_server_query_dualstack(struct dns_request *request)
safe_strncpy(request_dualstack->domain, request->domain, sizeof(request->domain));
request_dualstack->qtype = qtype;
request_dualstack->dualstack_selection_query = 1;
request_dualstack->has_cname_loop = request->has_cname_loop;
request_dualstack->prefetch = request->prefetch;
request_dualstack->prefetch_expired_domain = request->prefetch_expired_domain;
_dns_server_request_get(request);