瀏覽代碼

Bugfix: dns_server_query is not call callback function when rule is hit.

Nick Peng 5 年之前
父節點
當前提交
c5985d3f2d
共有 1 個文件被更改,包括 25 次插入3 次删除
  1. 25 3
      src/dns_server.c

+ 25 - 3
src/dns_server.c

@@ -183,6 +183,7 @@ struct dns_request {
 	int has_soa;
 
 	atomic_t notified;
+	atomic_t do_callback;
 	atomic_t adblock;
 	atomic_t soa_num;
 
@@ -552,6 +553,20 @@ static int _dns_reply(struct dns_request *request)
 	return _dns_reply_inpacket(request, inpacket, encode_len);
 }
 
+static int _dns_result_callback_nxdomain(struct dns_request *request)
+{
+	char ip[DNS_MAX_CNAME_LEN];
+	unsigned int ping_time = -1;
+
+
+	ip[0] = 0;
+	if (request->result_callback == NULL) {
+		return 0;
+	}
+
+	return request->result_callback(request->domain, DNS_RC_NXDOMAIN, request->qtype, ip, ping_time, request->user_ptr);
+}
+
 static int _dns_result_callback(struct dns_request *request)
 {
 	char ip[DNS_MAX_CNAME_LEN];
@@ -561,6 +576,10 @@ static int _dns_result_callback(struct dns_request *request)
 		return 0;
 	}
 
+	if (atomic_inc_return(&request->do_callback) != 1) {
+		return 0;
+	}
+
 	ip[0] = 0;
 	if (request->qtype == DNS_T_A) {
 		if (request->has_ipv4 == 0) {
@@ -583,12 +602,12 @@ static int _dns_result_callback(struct dns_request *request)
 		return request->result_callback(request->domain, request->rcode, request->qtype, ip, ping_time, request->user_ptr);
 	}
 
-	request->result_callback(request->domain, DNS_RC_NXDOMAIN, request->qtype, ip, ping_time, request->user_ptr);
+	_dns_result_callback_nxdomain(request);
 
 	return 0;
 out:
 
-	request->result_callback(request->domain, DNS_RC_NXDOMAIN, request->qtype, ip, ping_time, request->user_ptr);
+	_dns_result_callback_nxdomain(request);
 	return 0;
 }
 
@@ -960,6 +979,8 @@ static struct dns_request *_dns_server_new_request(void)
 	atomic_set(&request->adblock, 0);
 	atomic_set(&request->soa_num, 0);
 	atomic_set(&request->refcnt, 0);
+	atomic_set(&request->notified, 0);
+	atomic_set(&request->do_callback, 0);
 	request->ping_ttl_v4 = -1;
 	request->ping_ttl_v6 = -1;
 	request->prefetch = 0;
@@ -2356,7 +2377,7 @@ int dns_server_query(char *domain, int qtype, dns_result_callback callback, void
 		goto errout;
 	}
 
-	_dns_server_request_release_complete(request, 0);
+	_dns_server_request_release_complete(request, 1);
 	return ret;
 errout:
 	if (request) {
@@ -3234,3 +3255,4 @@ void dns_server_exit(void)
 
 	dns_cache_destroy();
 }
+