[tor-commits] [tor/release-0.3.2] Always set bridge-distribution-request on bridges' descriptors.

nickm at torproject.org nickm at torproject.org
Tue Oct 24 23:37:21 UTC 2017


commit 613b18f0afd865b0fc5daf8d17da241396100dcd
Author: Nick Mathewson <nickm at torproject.org>
Date:   Mon Oct 23 10:52:42 2017 -0400

    Always set bridge-distribution-request on bridges' descriptors.
    
    Also, warn the user if the BridgeDistribution option is
    unrecognized, and reject the value if it is invalid.
---
 src/or/config.c | 43 ++++++++++++++++++++++++++++++++++++++++---
 src/or/router.c | 10 +++++++---
 2 files changed, 47 insertions(+), 6 deletions(-)

diff --git a/src/or/config.c b/src/or/config.c
index 1bdfdf484..7f45bb2cb 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -654,7 +654,7 @@ static int parse_ports(or_options_t *options, int validate_only,
 static int check_server_ports(const smartlist_t *ports,
                               const or_options_t *options,
                               int *num_low_ports_out);
-
+static int check_bridge_distribution_setting(const char *bd);
 static int validate_data_directory(or_options_t *options);
 static int write_configuration_file(const char *fname,
                                     const or_options_t *options);
@@ -3347,10 +3347,16 @@ options_validate(or_options_t *old_options, or_options_t *options,
     options->DirPort_set = 0;
   }
 
-  if (options->BridgeDistribution && !options->BridgeRelay) {
-    REJECT("You have set BridgeDistribution, yet you didn't set BridgeRelay!");
+  if (options->BridgeDistribution) {
+    if (!options->BridgeRelay) {
+      REJECT("You set BridgeDistribution, but you didn't set BridgeRelay!");
+    }
+    if (check_bridge_distribution_setting(options->BridgeDistribution) < 0) {
+      REJECT("Invalid BridgeDistribution value.");
+    }
   }
 
+
   if (options->MinUptimeHidServDirectoryV2 < 0) {
     log_warn(LD_CONFIG, "MinUptimeHidServDirectoryV2 option must be at "
                         "least 0 seconds. Changing to 0.");
@@ -6344,6 +6350,37 @@ warn_client_dns_cache(const char *option, int disabling)
       "to your destination.");
 }
 
+/** Warn if <b>bd</b> is an unrecognized bridge distribution setting;
+ * return -1 if it is invalid. */
+static int
+check_bridge_distribution_setting(const char *bd)
+{
+  if (bd == NULL)
+    return 0;
+
+  const char *RECOGNIZED[] = {
+    "none", "any", "https", "email", "moat", "hyphae"
+  };
+  unsigned i;
+  for (i = 0; i < ARRAY_LENGTH(RECOGNIZED); ++i) {
+    if (!strcmp(bd, RECOGNIZED[i]))
+      return 0;
+  }
+
+  const char *cp = bd;
+  //  Method = (KeywordChar | "_") +
+  while (TOR_ISALNUM(*cp) || *cp == '-' || *cp == '_')
+    ++cp;
+
+  if (*cp == 0) {
+    log_warn(LD_CONFIG, "Unrecognized BridgeDistribution value %s. I'll "
+           "assume you know what you are doing...", escaped(bd));
+    return 0; // we reached the end of the string; all is well
+  } else {
+    return -1; // we found a bad character in the string.
+  }
+}
+
 /**
  * Parse port configuration for a single port type.
  *
diff --git a/src/or/router.c b/src/or/router.c
index 780d0444f..553264efa 100644
--- a/src/or/router.c
+++ b/src/or/router.c
@@ -2867,9 +2867,13 @@ router_dump_router_to_string(routerinfo_t *router,
     smartlist_add_asprintf(chunks, "contact %s\n", ci);
   }
 
-  if (options->BridgeRelay && options->BridgeDistribution &&
-      strlen(options->BridgeDistribution)) {
-    const char *bd = options->BridgeDistribution;
+  if (options->BridgeRelay) {
+    const char *bd;
+    if (options->BridgeDistribution && strlen(options->BridgeDistribution)) {
+      bd = options->BridgeDistribution;
+    } else {
+      bd = "any";
+    }
     if (strchr(bd, '\n') || strchr(bd, '\r'))
       bd = escaped(bd);
     smartlist_add_asprintf(chunks, "bridge-distribution-request %s\n", bd);





More information about the tor-commits mailing list