Fix segment fault

This commit is contained in:
Nick Peng
2018-06-14 23:49:01 +08:00
parent 35f945759d
commit 53df9f7063
4 changed files with 54 additions and 9 deletions

17
conf.c
View File

@@ -15,6 +15,7 @@ char dns_conf_server_ip[DNS_MAX_IPLEN];
int dns_conf_cachesize = DEFAULT_DNS_CACHE_SIZE; int dns_conf_cachesize = DEFAULT_DNS_CACHE_SIZE;
struct dns_servers dns_conf_servers[DNS_MAX_SERVERS]; struct dns_servers dns_conf_servers[DNS_MAX_SERVERS];
int dns_conf_server_num; int dns_conf_server_num;
int dns_conf_loglevel = TLOG_ERROR;
int config_bind(char *value) int config_bind(char *value)
{ {
@@ -77,6 +78,21 @@ int config_cache_size(char *value)
return 0; return 0;
} }
int config_log_level(char *value)
{
if (strncmp("debug", value, MAX_LINE_LEN) == 0) {
dns_conf_loglevel = TLOG_DEBUG;
} else if (strncmp("info", value, MAX_LINE_LEN) == 0) {
dns_conf_loglevel = TLOG_INFO;
} else if (strncmp("warn", value, MAX_LINE_LEN) == 0) {
dns_conf_loglevel = TLOG_WARN;
} else if (strncmp("error", value, MAX_LINE_LEN) == 0) {
dns_conf_loglevel = TLOG_ERROR;
}
return 0;
}
struct config_item { struct config_item {
const char *item; const char *item;
int (*item_func)(char *value); int (*item_func)(char *value);
@@ -88,6 +104,7 @@ struct config_item config_item[] = {
{"server-tcp", config_server_tcp}, {"server-tcp", config_server_tcp},
{"server-http", config_server_http}, {"server-http", config_server_http},
{"cache-size", config_cache_size}, {"cache-size", config_cache_size},
{"loglevel", config_log_level},
}; };
int config_item_num = sizeof(config_item) / sizeof(struct config_item); int config_item_num = sizeof(config_item) / sizeof(struct config_item);

View File

@@ -270,6 +270,19 @@ int _dns_server_request_complete(struct dns_request *request)
return ret; return ret;
} }
void _dns_server_request_release(struct dns_request *request);
void _dns_server_request_remove(struct dns_request *request)
{
pthread_mutex_lock(&server.request_list_lock);
if (list_empty(&request->list)) {
pthread_mutex_unlock(&server.request_list_lock);
return;
}
list_del_init(&request->list);
pthread_mutex_unlock(&server.request_list_lock);
_dns_server_request_release(request);
}
void _dns_server_request_release(struct dns_request *request) void _dns_server_request_release(struct dns_request *request)
{ {
struct dns_ip_address *addr_map; struct dns_ip_address *addr_map;
@@ -286,7 +299,7 @@ void _dns_server_request_release(struct dns_request *request)
} }
pthread_mutex_lock(&server.request_list_lock); pthread_mutex_lock(&server.request_list_lock);
list_del(&request->list); list_del_init(&request->list);
pthread_mutex_unlock(&server.request_list_lock); pthread_mutex_unlock(&server.request_list_lock);
_dns_server_request_complete(request); _dns_server_request_complete(request);
@@ -367,9 +380,19 @@ void _dns_server_ping_result(struct ping_host_struct *ping_host, const char *hos
if (may_complete) { if (may_complete) {
_dns_server_request_complete(request); _dns_server_request_complete(request);
_dns_server_request_remove(request);
} }
} }
int _dns_server_ping(struct dns_request *request, char *ip)
{
if (fast_ping_start(ip, 1, 0, 1000, _dns_server_ping_result, request) == NULL) {
return -1;
}
return 0;
}
int _dns_ip_address_check_add(struct dns_request *request, unsigned char *addr, dns_type_t addr_type) int _dns_ip_address_check_add(struct dns_request *request, unsigned char *addr, dns_type_t addr_type)
{ {
int key = 0; int key = 0;
@@ -453,7 +476,7 @@ static int _dns_server_process_answer(struct dns_request *request, char *domain,
if (addr[0] == 0) { if (addr[0] == 0) {
_dns_server_request_release(request); _dns_server_request_release(request);
tlog(TLOG_ERROR, "Ad blocker, domain: %s", domain); tlog(TLOG_WARN, "Ad blocker, domain: %s", domain);
break; break;
} }
@@ -467,7 +490,7 @@ static int _dns_server_process_answer(struct dns_request *request, char *domain,
} }
sprintf(ip, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]); sprintf(ip, "%d.%d.%d.%d", addr[0], addr[1], addr[2], addr[3]);
if (fast_ping_start(ip, 1, 0, 1000, _dns_server_ping_result, request) == NULL) { if (_dns_server_ping(request, ip) != 0) {
_dns_server_request_release(request); _dns_server_request_release(request);
} }
} break; } break;
@@ -496,7 +519,7 @@ static int _dns_server_process_answer(struct dns_request *request, char *domain,
sprintf(name, "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5], sprintf(name, "%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x:%.2x%.2x", addr[0], addr[1], addr[2], addr[3], addr[4], addr[5],
addr[6], addr[7], addr[8], addr[9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15]); addr[6], addr[7], addr[8], addr[9], addr[10], addr[11], addr[12], addr[13], addr[14], addr[15]);
if (fast_ping_start(name, 1, 0, 1000, _dns_server_ping_result, request) == NULL) { if (_dns_server_ping(request, ip) != 0) {
_dns_server_request_release(request); _dns_server_request_release(request);
} }
} break; } break;
@@ -548,6 +571,9 @@ static int dns_server_resolve_callback(char *domain, dns_result_type rtype, stru
tlog(TLOG_ERROR, "request faield, %s", domain); tlog(TLOG_ERROR, "request faield, %s", domain);
return -1; return -1;
} else { } else {
if (request->has_ipv4 == 0 && request->has_ipv6 == 0) {
_dns_server_request_remove(request);
}
_dns_server_request_release(request); _dns_server_request_release(request);
} }
@@ -702,6 +728,7 @@ static int _dns_server_recv(unsigned char *inpacket, int inpacket_len, struct so
tlog(TLOG_INFO, "query server %s from %s, qtype = %d\n", request->domain, gethost_by_addr(name, (struct sockaddr *)from, from_len), qtype); tlog(TLOG_INFO, "query server %s from %s, qtype = %d\n", request->domain, gethost_by_addr(name, (struct sockaddr *)from, from_len), qtype);
_dns_server_request_get(request);
pthread_mutex_lock(&server.request_list_lock); pthread_mutex_lock(&server.request_list_lock);
list_add_tail(&request->list, &server.request_list); list_add_tail(&request->list, &server.request_list);
pthread_mutex_unlock(&server.request_list_lock); pthread_mutex_unlock(&server.request_list_lock);
@@ -757,7 +784,7 @@ void _dns_server_tcp_ping_check(struct dns_request *request)
case DNS_T_A: { case DNS_T_A: {
_dns_server_request_get(request); _dns_server_request_get(request);
sprintf(ip, "%d.%d.%d.%d:80", addr_map->ipv4_addr[0], addr_map->ipv4_addr[1], addr_map->ipv4_addr[2], addr_map->ipv4_addr[3]); sprintf(ip, "%d.%d.%d.%d:80", addr_map->ipv4_addr[0], addr_map->ipv4_addr[1], addr_map->ipv4_addr[2], addr_map->ipv4_addr[3]);
if (fast_ping_start(ip, 1, 0, 1000, _dns_server_ping_result, request) == NULL) { if (_dns_server_ping(request, ip) != 0) {
_dns_server_request_release(request); _dns_server_request_release(request);
} }
} break; } break;
@@ -768,7 +795,7 @@ void _dns_server_tcp_ping_check(struct dns_request *request)
addr_map->ipv6_addr[7], addr_map->ipv6_addr[8], addr_map->ipv6_addr[9], addr_map->ipv6_addr[10], addr_map->ipv6_addr[11], addr_map->ipv6_addr[7], addr_map->ipv6_addr[8], addr_map->ipv6_addr[9], addr_map->ipv6_addr[10], addr_map->ipv6_addr[11],
addr_map->ipv6_addr[12], addr_map->ipv6_addr[13], addr_map->ipv6_addr[14], addr_map->ipv6_addr[15]); addr_map->ipv6_addr[12], addr_map->ipv6_addr[13], addr_map->ipv6_addr[14], addr_map->ipv6_addr[15]);
if (fast_ping_start(name, 1, 0, 1000, _dns_server_ping_result, request) == NULL) { if (_dns_server_ping(request, ip) != 0) {
_dns_server_request_release(request); _dns_server_request_release(request);
} }
} break; } break;
@@ -801,6 +828,7 @@ void _dns_server_period_run()
list_for_each_entry_safe(request, tmp, &check_list, check_list) list_for_each_entry_safe(request, tmp, &check_list, check_list)
{ {
_dns_server_tcp_ping_check(request); _dns_server_tcp_ping_check(request);
_dns_server_request_remove(request);
list_del_init(&request->check_list); list_del_init(&request->check_list);
_dns_server_request_release(request); _dns_server_request_release(request);
} }

View File

@@ -116,7 +116,7 @@ int smartdns_init()
} }
tlog_setlogscreen(1); tlog_setlogscreen(1);
tlog_setlevel(TLOG_ERROR); tlog_setlevel(dns_conf_loglevel);
if (dns_conf_server_num <= 0) { if (dns_conf_server_num <= 0) {
if (smartdns_load_from_resolv() != 0) { if (smartdns_load_from_resolv() != 0) {

View File

@@ -3,7 +3,7 @@
bind [::]:53 bind [::]:53
cache-size 1024 cache-size 1024
loglevel info loglevel error
#server 192.168.1.1 #server 192.168.1.1
server 114.114.114.114 server 114.114.114.114
@@ -13,5 +13,5 @@ server 223.5.5.5
server 208.67.222.222:5353 server 208.67.222.222:5353
server 202.141.178.13:5353 server 202.141.178.13:5353
#server 77.88.8.8:53 #server 77.88.8.8:53
#server 202.141.162.123:53 server 202.141.162.123:53
#server 101.132.183.99:53 #server 101.132.183.99:53