From 8b35048045dae865f92698c63e6fc97c488cc8da Mon Sep 17 00:00:00 2001 From: XieHan Date: Sun, 8 Aug 2021 15:43:41 +0800 Subject: [PATCH] fix bug when IPv6 nameserver in resolv.conf --- src/client/WFDnsClient.cc | 2 +- src/manager/WFGlobal.cc | 19 +++++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/src/client/WFDnsClient.cc b/src/client/WFDnsClient.cc index 1d329f052b..4279f92280 100644 --- a/src/client/WFDnsClient.cc +++ b/src/client/WFDnsClient.cc @@ -197,7 +197,7 @@ int WFDnsClient::init(const std::string& url, const std::string& search_list, id = 0; hosts = StringUtil::split_filter_empty(url, ','); - for(size_t i = 0; i < hosts.size(); i++) + for (size_t i = 0; i < hosts.size(); i++) { host = hosts[i]; if (strncasecmp(host.c_str(), "dns://", 6) != 0 && diff --git a/src/manager/WFGlobal.cc b/src/manager/WFGlobal.cc index 244e8379cb..4dac148867 100644 --- a/src/manager/WFGlobal.cc +++ b/src/manager/WFGlobal.cc @@ -24,6 +24,7 @@ #include #include #include +#include #include #include #include @@ -560,7 +561,8 @@ class __NameServiceManager #define MAX(x, y) ((x) >= (y) ? (x) : (y)) #define HOSTS_LINEBUF_INIT_SIZE 128 -static void __split_merge_str(const char *p, std::string& result) +static void __split_merge_str(const char *p, bool is_nameserver, + std::string& result) { const char *start; @@ -581,7 +583,16 @@ static void __split_merge_str(const char *p, std::string& result) if (!result.empty()) result.push_back(','); - result.append(start, p); + + std::string str(start, p); + if (is_nameserver) + { + struct in6_addr buf; + if (inet_pton(AF_INET6, str.c_str(), &buf) > 0) + str = "[" + str + "]"; + } + + result.append(str); } } @@ -643,9 +654,9 @@ static int __parse_resolv_conf(const char *path, { const char *p = (const char *)line; if (strncmp(p, "nameserver", 10) == 0) - __split_merge_str(p + 10, url); + __split_merge_str(p + 10, true, url); else if (strncmp(p, "search", 6) == 0) - __split_merge_str(p + 6, search_list); + __split_merge_str(p + 6, false, search_list); else if (strncmp(p, "options", 7) == 0) __set_options(p + 7, ndots, attempts, rotate); }