TS-3792: Pointing proxy.config.dns.resolv_conf at an empty (or nonexistant) file causes crashes. Prevent ATS from crashing.
Project: http://git-wip-us.apache.org/repos/asf/trafficserver/repo Commit: http://git-wip-us.apache.org/repos/asf/trafficserver/commit/cc623317 Tree: http://git-wip-us.apache.org/repos/asf/trafficserver/tree/cc623317 Diff: http://git-wip-us.apache.org/repos/asf/trafficserver/diff/cc623317 Branch: refs/heads/master Commit: cc6233173338d6304b89b959d35a6eda01f98e7c Parents: 576c2de Author: Zizhong Zhang <zizh...@linkedin.com> Authored: Tue Jul 28 22:21:30 2015 -0700 Committer: Brian Geffon <bri...@apache.org> Committed: Mon Aug 10 19:40:19 2015 -0700 ---------------------------------------------------------------------- iocore/dns/DNS.cc | 7 +++++++ lib/ts/ink_res_init.cc | 15 +++------------ 2 files changed, 10 insertions(+), 12 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/trafficserver/blob/cc623317/iocore/dns/DNS.cc ---------------------------------------------------------------------- diff --git a/iocore/dns/DNS.cc b/iocore/dns/DNS.cc index 4601147..1cb5698 100644 --- a/iocore/dns/DNS.cc +++ b/iocore/dns/DNS.cc @@ -883,6 +883,13 @@ write_dns(DNSHandler *h) int max_nscount = h->m_res->nscount; if (max_nscount > MAX_NAMED) max_nscount = MAX_NAMED; + if (max_nscount <= 0) { + Warning("There is no name server found in the resolv.conf"); + if (h->entries.head) { + dns_result(h, h->entries.head, NULL, false); + } + return; + } if (h->in_write_dns) return; http://git-wip-us.apache.org/repos/asf/trafficserver/blob/cc623317/lib/ts/ink_res_init.cc ---------------------------------------------------------------------- diff --git a/lib/ts/ink_res_init.cc b/lib/ts/ink_res_init.cc index 00dc938..958f2dd 100644 --- a/lib/ts/ink_res_init.cc +++ b/lib/ts/ink_res_init.cc @@ -432,7 +432,7 @@ ink_res_init(ink_res_state statp, ///< State object to update. #define MATCH(line, name) \ (!strncmp(line, name, sizeof(name) - 1) && (line[sizeof(name) - 1] == ' ' || line[sizeof(name) - 1] == '\t')) -retry_load_resolve_conf: + if ((fp = fopen(pResolvConf, "r")) != NULL) { /* read the config file */ while (fgets(buf, sizeof(buf), fp) != NULL) { @@ -521,17 +521,8 @@ retry_load_resolve_conf: (void)fclose(fp); } - if (nserv == 0 && strcmp(pResolvConf, "/etc/resolv.conf") != 0) { - syslog(LOG_WARNING, "WARNING: trying default because user specified did not have any resolvers"); - pResolvConf = "/etc/resolv.conf"; - goto retry_load_resolve_conf; - } - if (nserv == 0) { - syslog(LOG_ERR, "ERR: aborting the traffic server because it did not have any resolvers"); - abort(); - } - - statp->nscount = nserv; + if (nserv > 0) + statp->nscount = nserv; if (statp->defdname[0] == 0 && gethostname(buf, sizeof(statp->defdname) - 1) == 0 && (cp = strchr(buf, '.')) != NULL) ink_strlcpy(statp->defdname, cp + 1, sizeof(statp->defdname));