Skip to content

Commit f51f4ac

Browse files
committed
dns_server: fix cname loop issue.
1 parent 1a86c75 commit f51f4ac

File tree

2 files changed

+49
-1
lines changed

2 files changed

+49
-1
lines changed

src/dns_server.c

+17-1
Original file line numberDiff line numberDiff line change
@@ -5957,6 +5957,14 @@ static int _dns_server_process_cname(struct dns_request *request)
59575957
check_request = check_request->parent_request;
59585958
}
59595959

5960+
/* query cname domain */
5961+
if (child_request->has_cname_loop == 1 && strncasecmp(request->domain, cname->cname, DNS_MAX_CNAME_LEN) == 0) {
5962+
request->has_cname_loop = 0;
5963+
request->domain_rule.rules[DOMAIN_RULE_CNAME] = NULL;
5964+
tlog(TLOG_DEBUG, "query cname domain %s", request->domain);
5965+
goto out;
5966+
}
5967+
59605968
child_group_name = _dns_server_get_request_server_groupname(child_request);
59615969
if (child_group_name) {
59625970
/* reset dns group and setup child request domain group again when do query.*/
@@ -5975,13 +5983,21 @@ static int _dns_server_process_cname(struct dns_request *request)
59755983
return 1;
59765984

59775985
errout:
5978-
59795986
if (child_request) {
59805987
request->child_request = NULL;
59815988
_dns_server_request_release(child_request);
59825989
}
59835990

59845991
return -1;
5992+
5993+
out:
5994+
if (child_request) {
5995+
child_request->parent_request = NULL;
5996+
request->child_request = NULL;
5997+
_dns_server_request_release(child_request);
5998+
_dns_server_request_release(request);
5999+
}
6000+
return 0;
59856001
}
59866002

59876003
static enum DNS_CHILD_POST_RESULT

test/cases/test-cname.cc

+32
Original file line numberDiff line numberDiff line change
@@ -161,3 +161,35 @@ server 127.0.0.1:61053
161161
EXPECT_EQ(client.GetAnswer()[0].GetData(), "c.a.com.");
162162
EXPECT_EQ(client.GetAnswer()[1].GetData(), "4.5.6.7");
163163
}
164+
165+
TEST_F(Cname, query_cname)
166+
{
167+
smartdns::MockServer server_upstream;
168+
smartdns::Server server;
169+
170+
server_upstream.Start("udp://0.0.0.0:61053", [](struct smartdns::ServerRequestContext *request) {
171+
if (request->qtype != DNS_T_A) {
172+
return smartdns::SERVER_REQUEST_SOA;
173+
}
174+
175+
if (request->domain == "s.a.com") {
176+
smartdns::MockServer::AddIP(request, request->domain.c_str(), "4.5.6.7", 700);
177+
return smartdns::SERVER_REQUEST_OK;
178+
}
179+
180+
smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 611);
181+
return smartdns::SERVER_REQUEST_OK;
182+
});
183+
184+
server.Start(R"""(bind [::]:60053
185+
cname /a.com/s.a.com
186+
server 127.0.0.1:61053
187+
)""");
188+
smartdns::Client client;
189+
ASSERT_TRUE(client.Query("s.a.com", 60053));
190+
std::cout << client.GetResult() << std::endl;
191+
ASSERT_EQ(client.GetAnswerNum(), 1);
192+
EXPECT_EQ(client.GetStatus(), "NOERROR");
193+
EXPECT_EQ(client.GetAnswer()[0].GetName(), "s.a.com");
194+
EXPECT_EQ(client.GetAnswer()[0].GetData(), "4.5.6.7");
195+
}

0 commit comments

Comments
 (0)