Commit ca538290 authored by Sebastian Hahn's avatar Sebastian Hahn Committed by Nick Mathewson
Browse files

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.
parent 7f0fb8e6
Loading
Loading
Loading
Loading

changes/bug3289

0 → 100644
+5 −0
Changes for changes/bug3289: 5 added lines, 0 removed lines.
Original line number Diff line number Diff line
  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.
+25 −0
Changes for src/or/rendservice.c: 25 added lines, 0 removed lines.
Original line number Diff line number Diff line
@@ -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);