diff options
author | Sebastian Hahn <sebastian@torproject.org> | 2009-05-26 12:41:45 +0200 |
---|---|---|
committer | Sebastian Hahn <sebastian@torproject.org> | 2009-05-30 03:09:39 +0200 |
commit | e70fe116d3726401e0205e115294208a948a292e (patch) | |
tree | f10c55f65b6dc66cadff8d276922d050ded2cd71 | |
parent | 873faffb5ae1284b522041f7a8b2e3bbcd53e416 (diff) | |
download | tor-e70fe116d3726401e0205e115294208a948a292e.tar.gz tor-e70fe116d3726401e0205e115294208a948a292e.zip |
Consider *ListenAddress when warning about low ports and hibernation
Tas (thanks!) noticed that when *ListenAddress is set, Tor would
still warn on startup when *Port is low and hibernation is active.
The patch parses all the *ListenAddress lines, and checks the
ports. Bugfix on 0.2.1.15-rc
-rw-r--r-- | ChangeLog | 3 | ||||
-rw-r--r-- | src/or/config.c | 44 |
2 files changed, 42 insertions, 5 deletions
@@ -2,6 +2,9 @@ Changes in version 0.2.1.16-?? - 2009-??-?? o Minor bugfixes (on 0.2.0.x): - Log correct error messages for DNS-related network errors on Windows. + - Don't warn users about low port and hibernation mix when they + provide a *ListenAddress directive to fix that. Bugfix on + 0.2.1.15-rc. o Minor bugfixes (on 0.2.1.x): - When switching back and forth between bridge mode, do not start diff --git a/src/or/config.c b/src/or/config.c index b192ca8ffa..5bf3fd41b5 100644 --- a/src/or/config.c +++ b/src/or/config.c @@ -693,6 +693,9 @@ static int or_state_validate(or_state_t *old_options, or_state_t *options, static int or_state_load(void); static int options_init_logs(or_options_t *options, int validate_only); +static int is_listening_on_low_port(uint16_t port_option, + const config_line_t *listen_options); + static uint64_t config_parse_memunit(const char *s, int *ok); static int config_parse_interval(const char *s, int *ok); static void init_libevent(void); @@ -2617,6 +2620,36 @@ options_init(or_options_t *options) config_init(&options_format, options); } +/* Check if the port number given in <b>port_option</b> in combination with + * the specified port in <b>listen_options</b> will result in Tor actually + * opening a low port (meaning a port lower than 1024). Return 1 if + * it is, or 0 if it isn't or the concept of a low port isn't applicable for + * the platform we're on. */ +static int +is_listening_on_low_port(uint16_t port_option, + const config_line_t *listen_options) +{ +#ifdef MS_WINDOWS + return 0; /* No port is too low for windows. */ +#else + const config_line_t *l; + uint16_t p; + if (listen_options == NULL) { + if (port_option < 1024) { + return 1; + } + return 0; + } + for (l = listen_options; l; l = l->next) { + parse_addr_port(LOG_WARN, l->value, NULL, NULL, &p); + if (p<1024) { + return 1; + } + } + return 0; +#endif +} + /** Set all vars in the configuration object <b>options</b> to their default * values. */ static void @@ -3018,17 +3051,18 @@ options_validate(or_options_t *old_options, or_options_t *options, REJECT("TransPort and TransListenAddress are disabled in this build."); #endif -#ifndef MS_WINDOWS - if (options->AccountingMax && - (options->DirPort < 1024 || options->ORPort < 1024)) - log(LOG_WARN, LD_CONFIG, + if (options->AccountingMax && + (is_listening_on_low_port(options->ORPort, options->ORListenAddress) || + is_listening_on_low_port(options->DirPort, options->DirListenAddress))) + { + log(LOG_WARN, LD_CONFIG, "You have set AccountingMax to use hibernation. You have also " "chosen a low DirPort or OrPort. This combination can make Tor stop " "working when it tries to re-attach the port after a period of " "hibernation. Please choose a different port or turn off " "hibernation unless you know this combination will work on your " "platform."); -#endif + } if (options->ExcludeExitNodes || options->ExcludeNodes) { options->_ExcludeExitNodesUnion = routerset_new(); |