Преглед изворни кода

dns_group: fix bind group not working issue and DoH server issue.

Nick Peng пре 5 месеци
родитељ
комит
02fb20b833

+ 4 - 2
src/dns_client/client_quic.c

@@ -645,8 +645,7 @@ int _dns_client_send_quic_data(struct dns_query_struct *query, struct dns_server
 		struct epoll_event event;
 		_dns_client_shutdown_socket(server_info);
 		ret = _dns_client_quic_pending_data(stream, server_info, query, packet, len);
-
-		if (client.epoll_fd <= 0 || ret != 0) {
+		if (ret != 0) {
 			errno = ECONNRESET;
 			goto out;
 		}
@@ -656,6 +655,9 @@ int _dns_client_send_quic_data(struct dns_query_struct *query, struct dns_server
 		event.events = EPOLLIN;
 		event.data.ptr = server_info;
 		if (epoll_ctl(client.epoll_fd, EPOLL_CTL_MOD, server_info->fd, &event) != 0) {
+			if (errno == ENOENT) {
+				goto out;
+			}
 			tlog(TLOG_ERROR, "epoll ctl failed, %s", strerror(errno));
 			ret = -1;
 		}

+ 4 - 0
src/dns_client/client_socket.c

@@ -276,6 +276,10 @@ int _dns_client_send_data_to_buffer(struct dns_server_info *server_info, void *p
 	event.events = EPOLLIN | EPOLLOUT;
 	event.data.ptr = server_info;
 	if (epoll_ctl(client.epoll_fd, EPOLL_CTL_MOD, server_info->fd, &event) != 0) {
+		if (errno == ENOENT) {
+			/* fd not found, ignore */
+			return 0;
+		}
 		tlog(TLOG_ERROR, "epoll ctl failed, %s", strerror(errno));
 		return -1;
 	}

+ 1 - 1
src/dns_client/client_udp.c

@@ -376,7 +376,7 @@ int _dns_client_process_udp(struct dns_server_info *server_info, struct epoll_ev
 	/* update recv time */
 	time(&server_info->last_recv);
 
-	if (latency < server_info->drop_packet_latency_ms) {
+	if (latency > 0 && latency < server_info->drop_packet_latency_ms) {
 		tlog(TLOG_DEBUG, "drop packet from %s, latency: %d", from_host, latency);
 		return 0;
 	}

+ 4 - 3
src/dns_server/request.c

@@ -1250,6 +1250,10 @@ int _dns_server_setup_request_conf_pre(struct dns_request *request)
 		return 0;
 	}
 
+	if (request->conn && request->conn->dns_group != NULL && request->dns_group_name[0] == '\0') {
+		safe_strncpy(request->dns_group_name, request->conn->dns_group, sizeof(request->dns_group_name));
+	}
+
 	rule_group = dns_server_get_rule_group(request->dns_group_name);
 	if (rule_group == NULL) {
 		return -1;
@@ -1297,9 +1301,6 @@ void _dns_server_setup_dns_group_name(struct dns_request *request, const char **
 {
 	const char *group_name = NULL;
 	const char *temp_group_name = NULL;
-	if (request->conn) {
-		group_name = request->conn->dns_group;
-	}
 
 	temp_group_name = _dns_server_get_request_server_groupname(request);
 	if (temp_group_name != NULL) {

+ 1 - 1
src/dns_server/server_tcp.c

@@ -259,7 +259,7 @@ static int _dns_server_tcp_process_one_request(struct dns_server_conn_tcp_client
 				goto out;
 			}
 
-			len = http_head_parse(http_head, tcpclient->recvbuff.buf + proceed_len, tcpclient->recvbuff.size);
+			len = http_head_parse(http_head, tcpclient->recvbuff.buf + proceed_len, tcpclient->recvbuff.size  - proceed_len);
 			if (len < 0) {
 				if (len == -1) {
 					ret = 0;

+ 4 - 0
src/dns_server/server_tls.c

@@ -229,6 +229,10 @@ int _dns_server_ssl_poll_event(struct dns_server_conn_tls_client *tls_client, in
 
 	fd_event.data.ptr = tls_client;
 	if (epoll_ctl(server.epoll_fd, EPOLL_CTL_MOD, tls_client->tcp.head.fd, &fd_event) != 0) {
+		if (errno == ENOENT) {
+			/* fd not found, ignore */
+			return 0;
+		}
 		tlog(TLOG_ERROR, "epoll ctl failed, %s", strerror(errno));
 		goto errout;
 	}

+ 59 - 0
test/cases/test-group.cc

@@ -522,6 +522,65 @@ group-match -domain a.com
 	EXPECT_EQ(client.GetAnswer()[1].GetData(), "5.6.7.8");
 }
 
+TEST_F(Group, group_from_bind)
+{
+	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");
+			smartdns::MockServer::AddIP(request, request->domain.c_str(), "5.6.7.8");
+			return smartdns::SERVER_REQUEST_OK;
+		} else if (request->qtype == DNS_T_AAAA) {
+			smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::1");
+			smartdns::MockServer::AddIP(request, request->domain.c_str(), "2001:db8::2");
+			return smartdns::SERVER_REQUEST_OK;
+		}
+		return smartdns::SERVER_REQUEST_SOA;
+	});
+
+	server.MockPing(PING_TYPE_ICMP, "1.2.3.4", 60, 80);
+	server.MockPing(PING_TYPE_ICMP, "5.6.7.8", 60, 110);
+	server.MockPing(PING_TYPE_ICMP, "2001:db8::1", 60, 150);
+	server.MockPing(PING_TYPE_ICMP, "2001:db8::2", 60, 200);
+
+	server.Start(R"""(bind [::]:60053
+bind [::]:60054 -g client
+server 127.0.0.1:61053
+speed-check-mode none
+group-begin client
+address 1.1.1.1
+group-match -domain b.com
+)""");
+	smartdns::Client client;
+	ASSERT_TRUE(client.Query("a.com", 60053));
+	std::cout << client.GetResult() << std::endl;
+	ASSERT_EQ(client.GetAnswerNum(), 2);
+	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].GetData(), "1.2.3.4");
+	EXPECT_EQ(client.GetAnswer()[1].GetData(), "5.6.7.8");
+
+	ASSERT_TRUE(client.Query("b.com", 60053));
+	std::cout << client.GetResult() << std::endl;
+	ASSERT_EQ(client.GetAnswerNum(), 1);
+	EXPECT_EQ(client.GetStatus(), "NOERROR");
+	EXPECT_EQ(client.GetAnswer()[0].GetName(), "b.com");
+	EXPECT_EQ(client.GetAnswer()[0].GetTTL(), 600);
+	EXPECT_EQ(client.GetAnswer()[0].GetData(), "1.1.1.1");
+
+	ASSERT_TRUE(client.Query("a.com", 60054));
+	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].GetData(), "1.1.1.1");
+}
+
+
 TEST_F(Group, server_group_exclude_default)
 {
 	smartdns::MockServer server_upstream;