dns_server: fix pending query callback fail issue.
This commit is contained in:
@@ -259,6 +259,8 @@ static int is_ipv6_ready;
|
|||||||
static int _dns_server_prefetch_request(char *domain, dns_type_t qtype, uint32_t server_flags,
|
static int _dns_server_prefetch_request(char *domain, dns_type_t qtype, uint32_t server_flags,
|
||||||
struct dns_query_options *options);
|
struct dns_query_options *options);
|
||||||
|
|
||||||
|
static int _dns_server_get_answer(struct dns_server_post_context *context);
|
||||||
|
|
||||||
static int _dns_server_forward_request(unsigned char *inpacket, int inpacket_len)
|
static int _dns_server_forward_request(unsigned char *inpacket, int inpacket_len)
|
||||||
{
|
{
|
||||||
tlog(TLOG_DEBUG, "forward request.\n");
|
tlog(TLOG_DEBUG, "forward request.\n");
|
||||||
@@ -1432,6 +1434,14 @@ int _dns_server_reply_all_pending_list(struct dns_request *request, struct dns_s
|
|||||||
list_for_each_entry_safe(req, tmp, &(pending_list->request_list), pending_list)
|
list_for_each_entry_safe(req, tmp, &(pending_list->request_list), pending_list)
|
||||||
{
|
{
|
||||||
list_del(&req->pending_list);
|
list_del(&req->pending_list);
|
||||||
|
struct dns_server_post_context context_pending;
|
||||||
|
_dns_server_post_context_init_from(&context_pending, req, context->packet, context->inpacket,
|
||||||
|
context->inpacket_len);
|
||||||
|
context_pending.do_cache = 0;
|
||||||
|
context_pending.do_audit = 0;
|
||||||
|
context_pending.do_reply = 0;
|
||||||
|
context_pending.do_ipset = 0;
|
||||||
|
_dns_server_get_answer(&context_pending);
|
||||||
if (req->result_callback) {
|
if (req->result_callback) {
|
||||||
_dns_result_callback(req);
|
_dns_result_callback(req);
|
||||||
}
|
}
|
||||||
@@ -1440,7 +1450,6 @@ int _dns_server_reply_all_pending_list(struct dns_request *request, struct dns_s
|
|||||||
if (atomic_inc_return(&req->notified) != 1) {
|
if (atomic_inc_return(&req->notified) != 1) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
req->rcode = request->rcode;
|
|
||||||
/* When passthrough, modify the id to be the id of the client request. */
|
/* When passthrough, modify the id to be the id of the client request. */
|
||||||
dns_server_update_reply_packet_id(req, context->inpacket, context->inpacket_len);
|
dns_server_update_reply_packet_id(req, context->inpacket, context->inpacket_len);
|
||||||
ret = _dns_reply_inpacket(req, context->inpacket, context->inpacket_len);
|
ret = _dns_reply_inpacket(req, context->inpacket, context->inpacket_len);
|
||||||
@@ -4413,6 +4422,13 @@ static void _dns_server_tcp_idle_check(void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int testfunc(char *domain, dns_rtcode_t rtcode, dns_type_t addr_type, char *ip,
|
||||||
|
unsigned int ping_time, void *user_ptr)
|
||||||
|
{
|
||||||
|
tlog(TLOG_ERROR, "Result: %s, %d -> %s %d", domain, rtcode, ip, ping_time);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static void _dns_server_period_run_second(void)
|
static void _dns_server_period_run_second(void)
|
||||||
{
|
{
|
||||||
static unsigned int sec = 0;
|
static unsigned int sec = 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user