From ccb47ef3276e4dbdb31267ab2574578cb734925b Mon Sep 17 00:00:00 2001 From: Nick Peng Date: Wed, 28 Sep 2022 20:28:01 +0800 Subject: [PATCH] conf: fix local domain handling issues --- src/dns_conf.c | 44 ++++++++++++++++++++++++++++++-------------- src/dns_server.c | 35 +++++++++++++++++++++-------------- 2 files changed, 51 insertions(+), 28 deletions(-) diff --git a/src/dns_conf.c b/src/dns_conf.c index 31d1178..3dc8927 100644 --- a/src/dns_conf.c +++ b/src/dns_conf.c @@ -2123,26 +2123,42 @@ static int _config_log_level(void *data, int argc, char *argv[]) static void _config_setup_smartdns_domain(void) { char hostname[DNS_MAX_CNAME_LEN]; - /* get local host name */ - if (getdomainname(hostname, DNS_MAX_CNAME_LEN) != 0) { - gethostname(hostname, DNS_MAX_CNAME_LEN); + char domainname[DNS_MAX_CNAME_LEN]; + + hostname[0] = '\0'; + domainname[0] = '\0'; + + /* get local domain name */ + if (getdomainname(domainname, DNS_MAX_CNAME_LEN - 1) == 0) { + /* check domain is valid */ + if (strncmp(domainname, "(none)", DNS_MAX_CNAME_LEN - 1) == 0) { + domainname[0] = '\0'; + } } - /* get host name again */ - if (strncmp(hostname, "(none)", DNS_MAX_CNAME_LEN - 1) == 0) { - gethostname(hostname, DNS_MAX_CNAME_LEN); + if (gethostname(hostname, DNS_MAX_CNAME_LEN - 1) == 0) { + /* check hostname is valid */ + if (strncmp(hostname, "(none)", DNS_MAX_CNAME_LEN - 1) == 0) { + hostname[0] = '\0'; + } } - /* if hostname is (none), return smartdns */ - if (strncmp(hostname, "(none)", DNS_MAX_CNAME_LEN - 1) == 0) { - safe_strncpy(hostname, "smartdns", DNS_MAX_CNAME_LEN); + if (dns_conf_resolv_hostname == 1) { + /* add hostname to rule table */ + if (hostname[0] != '\0') { + _config_domain_rule_flag_set(hostname, DOMAIN_FLAG_SMARTDNS_DOMAIN, 0); + } + + /* add domainname to rule table */ + if (domainname[0] != '\0') { + char full_domain[DNS_MAX_CNAME_LEN]; + snprintf(full_domain, DNS_MAX_CNAME_LEN, "%.64s.%.128s", hostname, domainname); + _config_domain_rule_flag_set(full_domain, DOMAIN_FLAG_SMARTDNS_DOMAIN, 0); + } } - if (dns_conf_resolv_hostname == 1 && hostname[0] != '\0') { - _config_domain_rule_flag_set(hostname, DOMAIN_FLAG_SMARTDNS_DOMAIN, 0); - } - - if (dns_conf_server_name[0] != '\0') { + /* add server name to rule table */ + if (dns_conf_server_name[0] != '\0' && strncmp(dns_conf_server_name, "smartdns", DNS_MAX_CNAME_LEN - 1) != 0) { _config_domain_rule_flag_set(dns_conf_server_name, DOMAIN_FLAG_SMARTDNS_DOMAIN, 0); } diff --git a/src/dns_server.c b/src/dns_server.c index 8421c4e..aa951b8 100644 --- a/src/dns_server.c +++ b/src/dns_server.c @@ -3161,33 +3161,40 @@ static int _dns_server_process_local_ptr(struct dns_request *request) goto errout; } - char hostname[DNS_MAX_CNAME_LEN]; + char full_hostname[DNS_MAX_CNAME_LEN]; if (dns_conf_server_name[0] == 0) { - /* get local host name */ - if (getdomainname(hostname, DNS_MAX_CNAME_LEN) != 0) { - if (gethostname(hostname, DNS_MAX_CNAME_LEN) != 0) { - return -1; + char hostname[DNS_MAX_CNAME_LEN]; + char domainname[DNS_MAX_CNAME_LEN]; + + /* get local domain name */ + if (getdomainname(domainname, DNS_MAX_CNAME_LEN - 1) == 0) { + /* check domain is valid */ + if (strncmp(domainname, "(none)", DNS_MAX_CNAME_LEN - 1) == 0) { + domainname[0] = '\0'; } } - /* get host name again */ - if (strncmp(hostname, "(none)", DNS_MAX_CNAME_LEN - 1) == 0) { - if (gethostname(hostname, DNS_MAX_CNAME_LEN) != 0) { - return -1; + if (gethostname(hostname, DNS_MAX_CNAME_LEN - 1) == 0) { + /* check hostname is valid */ + if (strncmp(hostname, "(none)", DNS_MAX_CNAME_LEN - 1) == 0) { + hostname[0] = '\0'; } } - /* if hostname is (none), return smartdns */ - if (strncmp(hostname, "(none)", DNS_MAX_CNAME_LEN - 1) == 0) { - safe_strncpy(hostname, "smartdns", DNS_MAX_CNAME_LEN); + if (hostname[0] != '\0' && domainname[0] != '\0') { + snprintf(full_hostname, sizeof(full_hostname), "%.64s.%.128s", hostname, domainname); + } else if (hostname[0] != '\0') { + safe_strncpy(full_hostname, hostname, DNS_MAX_CNAME_LEN); + } else { + safe_strncpy(full_hostname, "smartdns", DNS_MAX_CNAME_LEN); } } else { /* return configured server name */ - safe_strncpy(hostname, dns_conf_server_name, DNS_MAX_CNAME_LEN); + safe_strncpy(full_hostname, dns_conf_server_name, DNS_MAX_CNAME_LEN); } request->has_ptr = 1; - safe_strncpy(request->ptr_hostname, hostname, DNS_MAX_CNAME_LEN); + safe_strncpy(request->ptr_hostname, full_hostname, DNS_MAX_CNAME_LEN); freeifaddrs(ifaddr); return 0;