[tor-commits] [tor/master] Warn when two hs use the same directory

nickm at torproject.org nickm at torproject.org
Mon May 30 19:50:44 UTC 2011


commit ca538290af507833c7cd5df7f663507c3540448d
Author: Sebastian Hahn <sebastian at torproject.org>
Date:   Sun May 29 00:54:59 2011 +0200

    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.
---
 changes/bug3289      |    5 +++++
 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 0000000..c469796
--- /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 edcf59d..a10e43f 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);





More information about the tor-commits mailing list