Skip to content

Commit 1a86c75

Browse files
committed
dns_server: fix nameserver issue for private PTR query.
1 parent 673e153 commit 1a86c75

File tree

2 files changed

+77
-0
lines changed

2 files changed

+77
-0
lines changed

src/dns_server.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5085,6 +5085,7 @@ static int _dns_server_process_local_ptr(struct dns_request *request)
50855085
prefix_t prefix;
50865086
radix_node_t *node = NULL;
50875087
struct local_addr_cache_item *addr_cache_item = NULL;
5088+
struct dns_nameserver_rule *ptr_nameserver_rule;
50885089

50895090
if (_dns_server_parser_addr_from_apra(request->domain, ptr_addr, &ptr_addr_len, sizeof(ptr_addr)) != 0) {
50905091
/* Determine if the smartdns service is in effect. */
@@ -5124,6 +5125,11 @@ static int _dns_server_process_local_ptr(struct dns_request *request)
51245125
}
51255126

51265127
out:
5128+
ptr_nameserver_rule = _dns_server_get_dns_rule(request, DOMAIN_RULE_NAMESERVER);
5129+
if (ptr_nameserver_rule != NULL && ptr_nameserver_rule->group_name[0] != 0) {
5130+
goto errout;
5131+
}
5132+
51275133
if (found == 0 && _dns_server_is_private_address(ptr_addr, ptr_addr_len) == 0) {
51285134
request->has_soa = 1;
51295135
_dns_server_setup_soa(request);

test/cases/test-ptr.cc

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -155,3 +155,74 @@ dualstack-ip-selection no
155155
EXPECT_EQ(client.GetAnswer()[0].GetType(), "PTR");
156156
EXPECT_EQ(client.GetAnswer()[0].GetData(), "my-server.");
157157
}
158+
159+
160+
TEST_F(Ptr, private_soa)
161+
{
162+
smartdns::MockServer server_upstream;
163+
smartdns::Server server;
164+
165+
server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
166+
if (request->qtype == DNS_T_A) {
167+
smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
168+
return smartdns::SERVER_REQUEST_OK;
169+
}
170+
171+
if (request->qtype == DNS_T_PTR) {
172+
dns_add_PTR(request->response_packet, DNS_RRS_AN, request->domain.c_str(), 30, "my-hostname");
173+
request->response_packet->head.rcode = DNS_RC_NOERROR;
174+
return smartdns::SERVER_REQUEST_OK;
175+
}
176+
177+
return smartdns::SERVER_REQUEST_SOA;
178+
});
179+
180+
server.Start(R"""(bind [::]:60053
181+
server 127.0.0.1:61053
182+
dualstack-ip-selection no
183+
)""");
184+
smartdns::Client client;
185+
ASSERT_TRUE(client.Query("4.3.168.192.in-addr.arpa PTR", 60053));
186+
std::cout << client.GetResult() << std::endl;
187+
ASSERT_EQ(client.GetAnswerNum(), 0);
188+
EXPECT_EQ(client.GetStatus(), "NOERROR");
189+
EXPECT_EQ(client.GetAuthority()[0].GetName(), "4.3.168.192.in-addr.arpa");
190+
EXPECT_EQ(client.GetAuthority()[0].GetTTL(), 600);
191+
EXPECT_EQ(client.GetAuthority()[0].GetType(), "SOA");
192+
}
193+
194+
TEST_F(Ptr, private_nameserver)
195+
{
196+
smartdns::MockServer server_upstream;
197+
smartdns::Server server;
198+
199+
server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) {
200+
if (request->qtype == DNS_T_A) {
201+
smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4");
202+
return smartdns::SERVER_REQUEST_OK;
203+
}
204+
205+
if (request->qtype == DNS_T_PTR) {
206+
dns_add_PTR(request->response_packet, DNS_RRS_AN, request->domain.c_str(), 30, "my-hostname");
207+
request->response_packet->head.rcode = DNS_RC_NOERROR;
208+
return smartdns::SERVER_REQUEST_OK;
209+
}
210+
211+
return smartdns::SERVER_REQUEST_SOA;
212+
});
213+
214+
server.Start(R"""(bind [::]:60053
215+
server 127.0.0.1:61053 -group test-server
216+
nameserver /168.192.in-addr.arpa/test-server
217+
dualstack-ip-selection no
218+
)""");
219+
smartdns::Client client;
220+
ASSERT_TRUE(client.Query("4.3.168.192.in-addr.arpa PTR", 60053));
221+
std::cout << client.GetResult() << std::endl;
222+
ASSERT_EQ(client.GetAnswerNum(), 1);
223+
EXPECT_EQ(client.GetStatus(), "NOERROR");
224+
EXPECT_EQ(client.GetAnswer()[0].GetName(), "4.3.168.192.in-addr.arpa");
225+
EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
226+
EXPECT_EQ(client.GetAnswer()[0].GetType(), "PTR");
227+
EXPECT_EQ(client.GetAnswer()[0].GetData(), "my-hostname.");
228+
}

0 commit comments

Comments
 (0)