Browse Source

Raise the part of torrc mapaddress handling that knows wildcards

This patch extracts the inner part of config_register_addressmaps --
the part that knows about detecting wildcard addresses addresses --
and makes it into a new function.  The new function is deliberately
not moved or reindented, so that the diff is smaller.

I need this to fix bug 6244.
Nick Mathewson 11 years ago
parent
commit
959f850056
2 changed files with 45 additions and 22 deletions
  1. 39 22
      src/or/config.c
  2. 6 0
      src/or/config.h

+ 39 - 22
src/or/config.c

@@ -4864,12 +4864,11 @@ config_register_addressmaps(const or_options_t *options)
 {
   smartlist_t *elts;
   config_line_t *opt;
-  char *from, *to;
+  const char *from, *to, *msg;
 
   addressmap_clear_configured();
   elts = smartlist_new();
   for (opt = options->AddressMap; opt; opt = opt->next) {
-    int from_wildcard = 0, to_wildcard = 0;
     smartlist_split_string(elts, opt->value, NULL,
                            SPLIT_SKIP_SPACE|SPLIT_IGNORE_BLANK, 2);
     if (smartlist_len(elts) < 2) {
@@ -4887,11 +4886,39 @@ config_register_addressmaps(const or_options_t *options)
       goto cleanup;
     }
 
-    if (!strcmp(to, "*") || !strcmp(from, "*")) {
-      log_warn(LD_CONFIG,"MapAddress '%s' is unsupported - can't remap from "
-               "or to *. Ignoring.",opt->value);
+    if (addressmap_register_auto(from, to, 0, ADDRMAPSRC_TORRC, &msg) < 0) {
+      log_warn(LD_CONFIG,"MapAddress '%s' failed: %s. Ignoring.", opt->value,
+               msg);
       goto cleanup;
     }
+
+    if (smartlist_len(elts) > 2)
+      log_warn(LD_CONFIG,"Ignoring extra arguments to MapAddress.");
+
+  cleanup:
+    SMARTLIST_FOREACH(elts, char*, cp, tor_free(cp));
+    smartlist_clear(elts);
+  }
+  smartlist_free(elts);
+}
+
+/** As addressmap_register(), but detect the wildcarded status of "from" and
+ * "to", and do not steal a reference to <b>to</b>. */
+/* XXXX024 move to connection_edge.c */
+int
+addressmap_register_auto(const char *from, const char *to,
+                         time_t expires,
+                         addressmap_entry_source_t addrmap_source,
+                         const char **msg)
+{
+  int from_wildcard = 0, to_wildcard = 0;
+
+  *msg = "whoops, forgot the error message";
+  if (1) {
+    if (!strcmp(to, "*") || !strcmp(from, "*")) {
+      *msg = "can't remap from or to *";
+      return -1;
+    }
     /* Detect asterisks in expressions of type: '*.example.com' */
     if (!strncmp(from,"*.",2)) {
       from += 2;
@@ -4903,30 +4930,20 @@ config_register_addressmaps(const or_options_t *options)
     }
 
     if (to_wildcard && !from_wildcard) {
-      log_warn(LD_CONFIG,
-                "Skipping invalid argument '%s' to MapAddress: "
-                "can only use wildcard (i.e. '*.') if 'from' address "
-                "uses wildcard also", opt->value);
-      goto cleanup;
+      *msg =  "can only use wildcard (i.e. '*.') if 'from' address "
+        "uses wildcard also";
+      return -1;
     }
 
     if (address_is_invalid_destination(to, 1)) {
-      log_warn(LD_CONFIG,
-                "Skipping invalid argument '%s' to MapAddress", opt->value);
-      goto cleanup;
+      *msg = "destination is invalid";
+      return -1;
     }
 
-    addressmap_register(from, tor_strdup(to), 0, ADDRMAPSRC_TORRC,
+    addressmap_register(from, tor_strdup(to), expires, addrmap_source,
                         from_wildcard, to_wildcard);
-
-    if (smartlist_len(elts) > 2)
-      log_warn(LD_CONFIG,"Ignoring extra arguments to MapAddress.");
-
-  cleanup:
-    SMARTLIST_FOREACH(elts, char*, cp, tor_free(cp));
-    smartlist_clear(elts);
   }
-  smartlist_free(elts);
+  return 0;
 }
 
 /**

+ 6 - 0
src/or/config.h

@@ -96,6 +96,12 @@ or_options_t *options_new(void);
 #endif
 
 void config_register_addressmaps(const or_options_t *options);
+/* XXXX024 move to connection_edge.h */
+int addressmap_register_auto(const char *from, const char *to,
+                             time_t expires,
+                             addressmap_entry_source_t addrmap_source,
+                             const char **msg);
+
 
 #endif