Selaa lähdekoodia

dns_conf: fix server-https options issue.

Nick Peng 1 vuosi sitten
vanhempi
sitoutus
d02bceabf1
6 muutettua tiedostoa jossa 44 lisäystä ja 34 poistoa
  1. 2 0
      .clang-tidy
  2. 2 1
      src/dns_client.c
  3. 34 27
      src/dns_conf.c
  4. 1 1
      src/dns_conf.h
  5. 1 1
      src/dns_server.c
  6. 4 4
      src/smartdns.c

+ 2 - 0
.clang-tidy

@@ -18,7 +18,9 @@ Checks: >
   -bugprone-suspicious-memory-comparison,
   -bugprone-not-null-terminated-result,
   -bugprone-signal-handler,
+  -bugprone-assignment-in-if-condition,
   -concurrency-mt-unsafe,
+  -modernize-macro-to-enum,
   -misc-unused-parameters,
   -misc-misplaced-widening-cast,
   -misc-no-recursion,

+ 2 - 1
src/dns_client.c

@@ -93,7 +93,7 @@ struct dns_server_info {
 	/* server ping handle */
 	struct ping_host_struct *ping_host;
 
-	char ip[DNS_HOSTNAME_LEN];
+	char ip[DNS_MAX_HOSTNAME];
 	int port;
 	char proxy_name[DNS_HOSTNAME_LEN];
 	/* server type */
@@ -3327,6 +3327,7 @@ static int _dns_client_send_https(struct dns_server_info *server_info, void *pac
 	http_len = snprintf((char *)inpacket, DNS_IN_PACKSIZE,
 						"POST %s HTTP/1.1\r\n"
 						"Host: %s\r\n"
+						"User-Agent: smartdns\r\n"
 						"content-type: application/dns-message\r\n"
 						"Content-Length: %d\r\n"
 						"\r\n",

+ 34 - 27
src/dns_conf.c

@@ -504,7 +504,9 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
 	unsigned char *spki = NULL;
 	int drop_packet_latency_ms = 0;
 	int is_bootstrap_dns = 0;
-	int is_hostip_set = 0;
+	char host_ip[DNS_MAX_IPLEN] = {0};
+	int no_tls_host_name = 0;
+	int no_tls_host_verify = 0;
 
 	int ttl = 0;
 	/* clang-format off */
@@ -576,14 +578,6 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
 		}
 	}
 
-	if (type == DNS_SERVER_HTTPS) {
-		safe_strncpy(server->hostname, server->server, sizeof(server->hostname));
-		safe_strncpy(server->httphost, server->server, sizeof(server->httphost));
-		if (server->path[0] == 0) {
-			safe_strncpy(server->path, "/", sizeof(server->path));
-		}
-	}
-
 	/* if port is not defined, set port to default 53 */
 	if (port == PORT_NOT_DEFINED) {
 		port = default_port;
@@ -624,6 +618,7 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
 
 		case 'k': {
 			server->skip_check_cert = 1;
+			no_tls_host_verify = 1;
 			break;
 		}
 		case 'b': {
@@ -655,10 +650,10 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
 			break;
 		}
 		case 258: {
-			if (check_is_ipaddr(server->server) != 0) {
-				_conf_domain_rule_address(server->server, optarg);
-				is_hostip_set = 1;
+			if (check_is_ipaddr(optarg) != 0) {
+				goto errout;
 			}
+			safe_strncpy(host_ip, optarg, DNS_MAX_IPLEN);
 			break;
 		}
 		case 259: {
@@ -669,6 +664,7 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
 			safe_strncpy(server->hostname, optarg, DNS_MAX_CNAME_LEN);
 			if (strncmp(server->hostname, "-", 2) == 0) {
 				server->hostname[0] = '\0';
+				no_tls_host_name = 1;
 			}
 			break;
 		}
@@ -678,6 +674,10 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
 		}
 		case 262: {
 			safe_strncpy(server->tls_host_verify, optarg, DNS_MAX_CNAME_LEN);
+			if (strncmp(server->tls_host_verify, "-", 2) == 0) {
+				server->tls_host_verify[0] = '\0';
+				no_tls_host_verify = 1;
+			}
 			break;
 		}
 		default:
@@ -686,23 +686,30 @@ static int _config_server(int argc, char *argv[], dns_server_type_t type, int de
 		}
 	}
 
-	/* if server is domain name, then verify domain */
-	if (server->tls_host_verify[0] == '\0' && check_is_ipaddr(server->server) != 0) {
-		safe_strncpy(server->tls_host_verify, server->server, DNS_MAX_CNAME_LEN);
-	}
-
-	/* update address rules for host-ip */
-	if (is_hostip_set == 1) {
-		struct dns_domain_rule *rule = _config_domain_rule_get(server->server);
-		if (rule) {
-			if (rule->rules[DOMAIN_RULE_ADDRESS_IPV4] != NULL && rule->rules[DOMAIN_RULE_ADDRESS_IPV6] == NULL) {
-				_conf_domain_rule_address(server->server, "#6");
-			} else if (rule->rules[DOMAIN_RULE_ADDRESS_IPV4] == NULL && rule->rules[DOMAIN_RULE_ADDRESS_IPV6] != NULL) {
-				_conf_domain_rule_address(server->server, "#4");
-			}
+	if (check_is_ipaddr(server->server) != 0) {
+		/* if server is domain name, then verify domain */
+		if (server->tls_host_verify[0] == '\0' && no_tls_host_verify == 0) {
+			safe_strncpy(server->tls_host_verify, server->server, DNS_MAX_CNAME_LEN);
+		}
+
+		if (server->hostname[0] == '\0' && no_tls_host_name == 0) {
+			safe_strncpy(server->hostname, server->server, DNS_MAX_CNAME_LEN);
+		}
+
+		if (server->httphost[0] == '\0') {
+			safe_strncpy(server->httphost, server->server, DNS_MAX_CNAME_LEN);
+		}
+
+		if (host_ip[0] != '\0') {
+			safe_strncpy(server->server, host_ip, DNS_MAX_IPLEN);
 		}
 	}
 
+	/* if server is domain name, then verify domain */
+	if (server->tls_host_verify[0] == '\0' && server->hostname[0] != '\0' && no_tls_host_verify == 0) {
+		safe_strncpy(server->tls_host_verify, server->hostname, DNS_MAX_CNAME_LEN);
+	}
+
 	/* add new server */
 	server->type = type;
 	server->port = port;
@@ -915,7 +922,7 @@ static int _config_setup_domain_key(const char *domain, char *domain_key, int do
 	return 0;
 }
 
-static struct dns_domain_rule *_config_domain_rule_get(const char *domain)
+static __attribute__((unused)) struct dns_domain_rule *_config_domain_rule_get(const char *domain)
 {
 	char domain_key[DNS_MAX_CONF_CNAME_LEN];
 	int len = 0;

+ 1 - 1
src/dns_conf.h

@@ -323,7 +323,7 @@ struct dns_edns_client_subnet {
 };
 
 struct dns_servers {
-	char server[DNS_MAX_IPLEN];
+	char server[DNS_MAX_CNAME_LEN];
 	unsigned short port;
 	unsigned int result_flag;
 	unsigned int server_flag;

+ 1 - 1
src/dns_server.c

@@ -2887,7 +2887,7 @@ static int _dns_server_process_ip_alias(struct dns_request *request, struct dns_
 {
 	int addr_num = 0;
 
-	if (alias == 0) {
+	if (alias == NULL) {
 		return 0;
 	}
 

+ 4 - 4
src/smartdns.c

@@ -28,9 +28,9 @@
 #include "hashtable.h"
 #include "list.h"
 #include "rbtree.h"
+#include "timer.h"
 #include "tlog.h"
 #include "util.h"
-#include "timer.h"
 #include <errno.h>
 #include <fcntl.h>
 #include <getopt.h>
@@ -157,7 +157,7 @@ static void _help(void)
 		"  -v            display version.\n"
 		"  -h            show this help message.\n"
 
-		"Online help: http://pymumu.github.io/smartdns\n"
+		"Online help: https://pymumu.github.io/smartdns\n"
 		"Copyright (C) Nick Peng <[email protected]>\n"
 		;
 	/* clang-format on */
@@ -773,7 +773,7 @@ int main(int argc, char *argv[])
 	struct stat sb;
 
 	static struct option long_options[] = {
-		{"cache-print", required_argument, 0, 256}, {"help", no_argument, 0, 'h'}, {NULL, 0, 0, 0}};
+		{"cache-print", required_argument, NULL, 256}, {"help", no_argument, NULL, 'h'}, {NULL, 0, NULL, 0}};
 
 	safe_strncpy(config_file, SMARTDNS_CONF_FILE, MAX_LINE_LEN);
 
@@ -788,7 +788,7 @@ int main(int argc, char *argv[])
 	sigprocmask(SIG_SETMASK, &empty_sigblock, NULL);
 	smartdns_close_allfds();
 
-	while ((opt = getopt_long(argc, argv, "fhc:p:SvxN:", long_options, 0)) != -1) {
+	while ((opt = getopt_long(argc, argv, "fhc:p:SvxN:", long_options, NULL)) != -1) {
 		switch (opt) {
 		case 'f':
 			is_run_as_daemon = 0;