diff options
author | Sebastian Hahn <sebastian@torproject.org> | 2011-05-29 00:54:59 +0200 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2011-05-30 15:47:06 -0400 |
commit | ca538290af507833c7cd5df7f663507c3540448d (patch) | |
tree | e2317f530a8be2a423784651d6a233ab42a20d51 | |
parent | 7f0fb8e6083128ff20b30d8cd29c220e9427d95e (diff) | |
download | tor-ca538290af507833c7cd5df7f663507c3540448d.tar.gz tor-ca538290af507833c7cd5df7f663507c3540448d.zip |
Warn when two hs use the same directory
This simple implementation has a few issues, but it should do for
0.2.2.x. We will want to revisit this later and make it smarter.
-rw-r--r-- | changes/bug3289 | 5 | ||||
-rw-r--r-- | src/or/rendservice.c | 25 |
2 files changed, 30 insertions, 0 deletions
diff --git a/changes/bug3289 b/changes/bug3289 new file mode 100644 index 0000000000..c469796d6e --- /dev/null +++ b/changes/bug3289 @@ -0,0 +1,5 @@ + o Minor bugfixes: + - Warn when the user configures two HiddenServiceDir lines that point + to the same directory. Bugfix on 0.0.6 (the version introducing + HiddenServiceDir); fixes bug 3289. + diff --git a/src/or/rendservice.c b/src/or/rendservice.c index edcf59d870..a10e43fead 100644 --- a/src/or/rendservice.c +++ b/src/or/rendservice.c @@ -181,6 +181,31 @@ rend_add_service(rend_service_t *service) log_warn(LD_CONFIG, "Hidden service with no ports configured; ignoring."); rend_service_free(service); } else { + int dupe = 0; + /* XXX This duplicate check has two problems: + * + * a) It's O(n^2), but the same comment from the bottom of + * rend_config_services() should apply. + * + * b) We only compare directory paths as strings, so we can't + * detect two distinct paths that specify the same directory + * (which can arise from symlinks, case-insensitivity, bind + * mounts, etc.). + * + * It also can't detect that two separate Tor instances are trying + * to use the same HiddenServiceDir; for that, we would need a + * lock file. But this is enough to detect a simple mistake that + * at least one person has actually made. + */ + SMARTLIST_FOREACH(rend_service_list, rend_service_t*, ptr, + dupe = dupe || + !strcmp(ptr->directory, service->directory)); + if (dupe) { + log_warn(LD_REND, "Another hidden service is already configured for " + "directory %s, ignoring.", service->directory); + rend_service_free(service); + return; + } smartlist_add(rend_service_list, service); log_debug(LD_REND,"Configuring service with directory \"%s\"", service->directory); |