diff --git a/src/or/config.c b/src/or/config.c index cca9a3c402..522e0c06fc 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -265,6 +265,7 @@ static config_var_t _option_vars[] = { V(RunTesting, BOOL, "0"), V(SafeLogging, BOOL, "1"), V(SafeSocks, BOOL, "0"), + V(ServerDNSAllowBrokenResolvConf, BOOL, "0"), V(ServerDNSAllowNonRFC953Hostnames, BOOL,"0"), V(ServerDNSDetectHijacking, BOOL, "1"), V(ServerDNSResolvConfFile, STRING, NULL), @@ -3252,7 +3253,7 @@ options_validate(or_options_t *old_options, or_options_t *options, if (options->V3AuthVoteDelay + options->V3AuthDistDelay >= options->V3AuthVotingInterval/2) { - REJECT("V3AuthVoteDelay and V3AuthDistDelay must be no more than half " + REJECT("V3AuthVoteDelay plus V3AuthDistDelay must be less than half " "V3AuthVotingInterval"); } if (options->V3AuthVoteDelay < MIN_VOTE_SECONDS) diff --git a/src/or/dns.c b/src/or/dns.c index 79af4f0607..e1a56e4c1f 100644 --- a/src/or/dns.c +++ b/src/or/dns.c @@ -1108,7 +1108,7 @@ configure_nameservers(int force) if (stat(conf_fname, &st)) { log_warn(LD_EXIT, "Unable to stat resolver configuration in '%s': %s", conf_fname, strerror(errno)); - return -1; + return options->ServerDNSAllowBrokenResolvConf ? 0 : -1; } if (!force && resolv_conf_fname && !strcmp(conf_fname,resolv_conf_fname) && st.st_mtime == resolv_conf_mtime) { @@ -1123,11 +1123,11 @@ configure_nameservers(int force) if ((r = evdns_resolv_conf_parse(DNS_OPTIONS_ALL, conf_fname))) { log_warn(LD_EXIT, "Unable to parse '%s', or no nameservers in '%s' (%d)", conf_fname, conf_fname, r); - return -1; + return options->ServerDNSAllowBrokenResolvConf ? 0 : -1; } if (evdns_count_nameservers() == 0) { log_warn(LD_EXIT, "Unable to find any nameservers in '%s'.", conf_fname); - return -1; + return options->ServerDNSAllowBrokenResolvConf ? 0 : -1; } tor_free(resolv_conf_fname); resolv_conf_fname = tor_strdup(conf_fname); @@ -1143,13 +1143,13 @@ configure_nameservers(int force) } if (evdns_config_windows_nameservers()) { log_warn(LD_EXIT,"Could not config nameservers."); - return -1; + return options->ServerDNSAllowBrokenResolvConf ? 0 : -1; } if (evdns_count_nameservers() == 0) { log_warn(LD_EXIT, "Unable to find any platform nameservers in " "your Windows configuration. Perhaps you should list a " "ServerDNSResolvConfFile file in your torrc?"); - return -1; + return options->ServerDNSAllowBrokenResolvConf ? 0 : -1; } if (nameservers_configured) evdns_resume(); diff --git a/src/or/or.h b/src/or/or.h index 9ec57784fd..c2c4c0c560 100644 --- a/src/or/or.h +++ b/src/or/or.h @@ -2291,6 +2291,10 @@ typedef struct { char *ServerDNSResolvConfFile; /**< If provided, we configure our internal * resolver from the file here rather than from * /etc/resolv.conf (Unix) or the registry (Windows). */ + /** Boolean: if set, we start even if our resolv.conf file is missing + * or broken. */ + int ServerDNSAllowBrokenResolvConf; + smartlist_t *ServerDNSTestAddresses; /**< A list of addresses that definitely * should be resolveable. Used for * testing our DNS server. */