dns_server: fix ip number is only one when speed check is none
This commit is contained in:
@@ -1458,6 +1458,7 @@ int _dns_server_reply_all_pending_list(struct dns_request *request, struct dns_s
|
|||||||
context_pending.do_reply = context->do_reply;
|
context_pending.do_reply = context->do_reply;
|
||||||
context_pending.do_force_soa = context->do_force_soa;
|
context_pending.do_force_soa = context->do_force_soa;
|
||||||
context_pending.do_ipset = 0;
|
context_pending.do_ipset = 0;
|
||||||
|
context_pending.reply_ttl = request->ip_ttl;
|
||||||
_dns_server_reply_passthrouth(&context_pending);
|
_dns_server_reply_passthrouth(&context_pending);
|
||||||
|
|
||||||
req->request_pending_list = NULL;
|
req->request_pending_list = NULL;
|
||||||
@@ -1753,6 +1754,11 @@ static void _dns_server_complete_with_multi_ipaddress(struct dns_request *reques
|
|||||||
{
|
{
|
||||||
struct dns_server_post_context context;
|
struct dns_server_post_context context;
|
||||||
int do_reply = 0;
|
int do_reply = 0;
|
||||||
|
|
||||||
|
if (request->passthrough) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (request->ip_map_num > 0) {
|
if (request->ip_map_num > 0) {
|
||||||
request->has_soa = 0;
|
request->has_soa = 0;
|
||||||
}
|
}
|
||||||
@@ -1780,8 +1786,10 @@ static void _dns_server_request_release_complete(struct dns_request *request, in
|
|||||||
struct hlist_node *tmp;
|
struct hlist_node *tmp;
|
||||||
int bucket = 0;
|
int bucket = 0;
|
||||||
|
|
||||||
|
pthread_mutex_lock(&server.request_list_lock);
|
||||||
int refcnt = atomic_dec_return(&request->refcnt);
|
int refcnt = atomic_dec_return(&request->refcnt);
|
||||||
if (refcnt) {
|
if (refcnt) {
|
||||||
|
pthread_mutex_unlock(&server.request_list_lock);
|
||||||
if (refcnt < 0) {
|
if (refcnt < 0) {
|
||||||
tlog(TLOG_ERROR, "BUG: refcnt is %d, domain %s, qtype %d", refcnt, request->domain, request->qtype);
|
tlog(TLOG_ERROR, "BUG: refcnt is %d, domain %s, qtype %d", refcnt, request->domain, request->qtype);
|
||||||
abort();
|
abort();
|
||||||
@@ -1789,7 +1797,6 @@ static void _dns_server_request_release_complete(struct dns_request *request, in
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pthread_mutex_lock(&server.request_list_lock);
|
|
||||||
list_del_init(&request->list);
|
list_del_init(&request->list);
|
||||||
pthread_mutex_unlock(&server.request_list_lock);
|
pthread_mutex_unlock(&server.request_list_lock);
|
||||||
|
|
||||||
@@ -2536,11 +2543,20 @@ static int _dns_server_get_answer(struct dns_server_post_context *context)
|
|||||||
|
|
||||||
/* get A result */
|
/* get A result */
|
||||||
dns_get_A(rrs, name, DNS_MAX_CNAME_LEN, &ttl, addr);
|
dns_get_A(rrs, name, DNS_MAX_CNAME_LEN, &ttl, addr);
|
||||||
|
if (_dns_ip_address_check_add(request, name, addr, DNS_T_A) != 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
context->ip_num++;
|
||||||
|
if (request->has_ip == 1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(request->ip_addr, addr, DNS_RR_A_LEN);
|
memcpy(request->ip_addr, addr, DNS_RR_A_LEN);
|
||||||
|
/* add this ip to reqeust */
|
||||||
request->ip_ttl = _dns_server_get_conf_ttl(ttl);
|
request->ip_ttl = _dns_server_get_conf_ttl(ttl);
|
||||||
request->has_ip = 1;
|
request->has_ip = 1;
|
||||||
request->rcode = packet->head.rcode;
|
request->rcode = packet->head.rcode;
|
||||||
context->ip_num++;
|
|
||||||
} break;
|
} break;
|
||||||
case DNS_T_AAAA: {
|
case DNS_T_AAAA: {
|
||||||
unsigned char addr[16];
|
unsigned char addr[16];
|
||||||
@@ -2551,11 +2567,19 @@ static int _dns_server_get_answer(struct dns_server_post_context *context)
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
dns_get_AAAA(rrs, name, DNS_MAX_CNAME_LEN, &ttl, addr);
|
dns_get_AAAA(rrs, name, DNS_MAX_CNAME_LEN, &ttl, addr);
|
||||||
|
if (_dns_ip_address_check_add(request, name, addr, DNS_T_AAAA) != 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
context->ip_num++;
|
||||||
|
if (request->has_ip == 1) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
memcpy(request->ip_addr, addr, DNS_RR_AAAA_LEN);
|
memcpy(request->ip_addr, addr, DNS_RR_AAAA_LEN);
|
||||||
request->ip_ttl = _dns_server_get_conf_ttl(ttl);
|
request->ip_ttl = _dns_server_get_conf_ttl(ttl);
|
||||||
request->has_ip = 1;
|
request->has_ip = 1;
|
||||||
request->rcode = packet->head.rcode;
|
request->rcode = packet->head.rcode;
|
||||||
context->ip_num++;
|
|
||||||
} break;
|
} break;
|
||||||
case DNS_T_NS: {
|
case DNS_T_NS: {
|
||||||
char cname[DNS_MAX_CNAME_LEN];
|
char cname[DNS_MAX_CNAME_LEN];
|
||||||
|
|||||||
@@ -101,6 +101,7 @@ int drop_root_privilege(void)
|
|||||||
header.pid = 0;
|
header.pid = 0;
|
||||||
int uid;
|
int uid;
|
||||||
int gid;
|
int gid;
|
||||||
|
int unused __attribute__((unused));
|
||||||
|
|
||||||
if (get_uid_gid(&uid, &gid) != 0) {
|
if (get_uid_gid(&uid, &gid) != 0) {
|
||||||
return -1;
|
return -1;
|
||||||
@@ -113,8 +114,8 @@ int drop_root_privilege(void)
|
|||||||
prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
|
prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);
|
||||||
cap.effective |= (1 << CAP_NET_RAW | 1 << CAP_NET_ADMIN);
|
cap.effective |= (1 << CAP_NET_RAW | 1 << CAP_NET_ADMIN);
|
||||||
cap.permitted |= (1 << CAP_NET_RAW | 1 << CAP_NET_ADMIN);
|
cap.permitted |= (1 << CAP_NET_RAW | 1 << CAP_NET_ADMIN);
|
||||||
setuid(uid);
|
unused = setuid(uid);
|
||||||
setgid(gid);
|
unused = setgid(gid);
|
||||||
if (capset(&header, &cap) < 0) {
|
if (capset(&header, &cap) < 0) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
@@ -476,7 +477,7 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
/* patch for Asus router: unblock all signal*/
|
/* patch for Asus router: unblock all signal*/
|
||||||
sigemptyset(&empty_sigblock);
|
sigemptyset(&empty_sigblock);
|
||||||
sigprocmask(SIG_SETMASK, &empty_sigblock, NULL);
|
sigprocmask(SIG_SETMASK, &empty_sigblock, NULL);
|
||||||
|
|
||||||
while ((opt = getopt(argc, argv, "fhc:p:Svx")) != -1) {
|
while ((opt = getopt(argc, argv, "fhc:p:Svx")) != -1) {
|
||||||
switch (opt) {
|
switch (opt) {
|
||||||
|
|||||||
Reference in New Issue
Block a user