diff --git a/src/dns_server.c b/src/dns_server.c index e9483fd..159bc20 100644 --- a/src/dns_server.c +++ b/src/dns_server.c @@ -4233,6 +4233,10 @@ static int _dns_server_pre_process_rule_flags(struct dns_request *request) goto skip_soa_out; } + if (request->domain_rule.rules[DOMAIN_RULE_ADDRESS_IPV4] != NULL) { + goto skip_soa_out; + } + if (_dns_server_is_return_soa(request)) { /* return SOA for A request */ if (_dns_server_is_return_soa_qtype(request, DNS_T_AAAA)) { @@ -4247,6 +4251,10 @@ static int _dns_server_pre_process_rule_flags(struct dns_request *request) goto skip_soa_out; } + if (request->domain_rule.rules[DOMAIN_RULE_ADDRESS_IPV6] != NULL) { + goto skip_soa_out; + } + if (_dns_server_is_return_soa(request)) { /* return SOA for A request */ if (_dns_server_is_return_soa_qtype(request, DNS_T_A)) { diff --git a/test/cases/test-address.cc b/test/cases/test-address.cc index f83dc7e..b52ece4 100644 --- a/test/cases/test-address.cc +++ b/test/cases/test-address.cc @@ -252,3 +252,49 @@ cache-persist no)"""); EXPECT_EQ(check_result->GetType(), "AAAA"); EXPECT_EQ(check_result->GetData(), "64:ff9b::2222:2222"); } + +TEST_F(Address, soa_sub_ip) +{ + smartdns::MockServer server_upstream; + smartdns::Server server; + + server_upstream.Start("udp://0.0.0.0:61053", [&](struct smartdns::ServerRequestContext *request) { + if (request->qtype == DNS_T_A) { + smartdns::MockServer::AddIP(request, request->domain.c_str(), "1.2.3.4", 700); + return smartdns::SERVER_REQUEST_OK; + } else if (request->qtype == DNS_T_AAAA) { + smartdns::MockServer::AddIP(request, request->domain.c_str(), "64:ff9b::102:304", 700); + return smartdns::SERVER_REQUEST_OK; + } + return smartdns::SERVER_REQUEST_SOA; + }); + + server.Start(R"""(bind [::]:60053 +server 127.0.0.1:61053 +log-num 0 +log-console yes +log-level debug +speed-check-mode none +address /a.com/192.168.1.1 +address /com/# +cache-persist no)"""); + smartdns::Client client; + ASSERT_TRUE(client.Query("a.com A", 60053)); + std::cout << client.GetResult() << std::endl; + ASSERT_EQ(client.GetAnswerNum(), 1); + EXPECT_EQ(client.GetStatus(), "NOERROR"); + EXPECT_EQ(client.GetAnswer()[0].GetName(), "a.com"); + EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600); + EXPECT_EQ(client.GetAnswer()[0].GetType(), "A"); + EXPECT_EQ(client.GetAnswer()[0].GetData(), "192.168.1.1"); + + ASSERT_TRUE(client.Query("a.com AAAA", 60053)); + std::cout << client.GetResult() << std::endl; + ASSERT_EQ(client.GetAnswerNum(), 0); + EXPECT_EQ(client.GetStatus(), "NXDOMAIN"); + + ASSERT_TRUE(client.Query("b.com A", 60053)); + std::cout << client.GetResult() << std::endl; + ASSERT_EQ(client.GetAnswerNum(), 0); + EXPECT_EQ(client.GetStatus(), "NXDOMAIN"); +} \ No newline at end of file