[tor-commits] [tor/master] Fixes small bugs.

nickm at torproject.org nickm at torproject.org
Mon Jul 11 20:01:36 UTC 2011


commit 93526cdf0b9a9df1bcb69454060d24d819c15024
Author: George Kadianakis <desnacked at gmail.com>
Date:   Tue Jun 14 16:00:55 2011 +0200

    Fixes small bugs.
---
 src/or/circuitbuild.c  |   50 ++++++++++++++++++++++++++++++++++++++++++-----
 src/or/circuitbuild.h  |    4 +-
 src/or/config.c        |   28 +++++++++++++++++++-------
 src/or/connection.c    |    5 +--
 src/or/connection_or.c |    5 +++-
 5 files changed, 72 insertions(+), 20 deletions(-)

diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index 4dcc685..53a3063 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -4594,21 +4594,39 @@ transport_free(transport_info_t *transport)
 /** Remember a new pluggable transport proxy at <b>addr</b>:<b>port</b>.
     <b>name</b> is set to the name of the protocol this proxy uses.
     <b>socks_ver</b> is set to the SOCKS version of the proxy.
+
+    Returns 1 on success, -1 on fail.
 */
-void
+int
 transport_add_from_config(const tor_addr_t *addr, uint16_t port,
                           const char *name, int socks_ver)
 {
   transport_info_t *t = tor_malloc_zero(sizeof(transport_info_t));
 
+  if (transport_list) { /*check out for duplicate transport names*/
+    SMARTLIST_FOREACH_BEGIN(transport_list, transport_info_t *, transport) {
+      if (!strcmp(transport->name, name)) {
+        log_notice(LD_CONFIG, "More than one transports have '%s' as "
+                 "their name.", transport->name);
+        goto err;
+      }
+    } SMARTLIST_FOREACH_END(transport);
+  }
+
   tor_addr_copy(&t->addr, addr);
   t->port = port;
   t->name = tor_strdup(name);
+
   t->socks_version = socks_ver;
   if (!transport_list)
     transport_list = smartlist_create();
 
   smartlist_add(transport_list, t);
+  return 1;
+
+ err:
+  tor_free(t);
+  return -1;
 }
 
 /**
@@ -4645,9 +4663,8 @@ match_bridges_with_transports(void)
             found_match=1;
             n_matches++;
             b->transport = t;
-            tor_free(b->transport_name_config);
             log_warn(LD_CONFIG, "Matched transport '%s'", t->name);
-            continue;
+            break;
           }
         } SMARTLIST_FOREACH_END(t);
       if (!found_match) {
@@ -4667,6 +4684,10 @@ match_bridges_with_transports(void)
     return -1;
   }
 
+  /* clear the method names taken from the config, we no longer need them. */
+  SMARTLIST_FOREACH(bridge_list, bridge_info_t *, b, 
+                    tor_free(b->transport_name_config));
+
   return 1;
 }
 
@@ -4751,8 +4772,10 @@ learned_router_identity(const tor_addr_t *addr, uint16_t port,
  * bridge in our list, unmark it, and don't actually add anything new.
  * If <b>transport_name</b> is non-NULL - the bridge is associated with a
  * pluggable transport - we assign the transport to the bridge.
+ *
+ * Returns 1 on success, -1 on fail.
  */
-void
+int
 bridge_add_from_config(const tor_addr_t *addr, uint16_t port,
                        const char *digest, const char *transport_name)
 {
@@ -4760,7 +4783,7 @@ bridge_add_from_config(const tor_addr_t *addr, uint16_t port,
 
   if ((b = get_configured_bridge_by_addr_port_digest(addr, port, digest))) {
     b->marked_for_removal = 0;
-    return;
+    return 1;
   }
 
   b = tor_malloc_zero(sizeof(bridge_info_t));
@@ -4768,13 +4791,28 @@ bridge_add_from_config(const tor_addr_t *addr, uint16_t port,
   b->port = port;
   if (digest)
     memcpy(b->identity, digest, DIGEST_LEN);
-  if (transport_name)
+  if (transport_name) {
+    if (bridge_list) { /*check out for duplicate transport names*/
+      SMARTLIST_FOREACH_BEGIN(bridge_list, bridge_info_t *, bridge) {
+        if (!strcmp(bridge->transport_name_config, transport_name)) {
+          log_notice(LD_CONFIG, "More than one bridges have '%s' as "
+                   "their transport name.", transport_name);
+          goto err;
+        }
+      } SMARTLIST_FOREACH_END(bridge);
+    }
     b->transport_name_config = strdup(transport_name);
+  }
   b->fetch_status.schedule = DL_SCHED_BRIDGE;
   if (!bridge_list)
     bridge_list = smartlist_create();
 
   smartlist_add(bridge_list, b);
+  return 1;
+
+ err:
+  tor_free(b);
+  return -1;
 }
 
 /** Return true iff <b>routerset</b> contains the bridge <b>bridge</b>. */
diff --git a/src/or/circuitbuild.h b/src/or/circuitbuild.h
index c1833d2..9e05d6e 100644
--- a/src/or/circuitbuild.h
+++ b/src/or/circuitbuild.h
@@ -82,7 +82,7 @@ int routerinfo_is_a_configured_bridge(const routerinfo_t *ri);
 int node_is_a_configured_bridge(const node_t *node);
 void learned_router_identity(const tor_addr_t *addr, uint16_t port,
                              const char *digest);
-void bridge_add_from_config(const tor_addr_t *addr, uint16_t port,
+int bridge_add_from_config(const tor_addr_t *addr, uint16_t port,
                             const char *digest,
                             const char *transport_name);
 void retry_bridge_descriptor_fetch_directly(const char *digest);
@@ -142,7 +142,7 @@ int circuit_build_times_get_bw_scale(networkstatus_t *ns);
 
 void clear_transport_list(void);
 int match_bridges_with_transports(void);
-void transport_add_from_config(const tor_addr_t *addr, uint16_t port,
+int transport_add_from_config(const tor_addr_t *addr, uint16_t port,
                                const char *name, int socks_ver);
 transport_info_t *
 find_transport_by_bridge_addrport(const tor_addr_t *addr, uint16_t port);
diff --git a/src/or/config.c b/src/or/config.c
index 4770287..a78252c 100644
--- a/src/or/config.c
+++ b/src/or/config.c
@@ -570,7 +570,8 @@ static int options_transition_affects_descriptor(or_options_t *old_options,
 static int check_nickname_list(const char *lst, const char *name, char **msg);
 static void config_register_addressmaps(or_options_t *options);
 
-static int parse_bridge_line(const char *line, int validate_only);
+static int parse_bridge_line(const char *line, int validate_only,
+                             or_options_t *options);
 static int parse_client_transport_line(const char *line, int validate_only);
 static int parse_dir_server_line(const char *line,
                                  dirinfo_type_t required_type,
@@ -1222,7 +1223,7 @@ options_act(or_options_t *old_options)
   if (options->Bridges) {
     mark_bridge_list();
     for (cl = options->Bridges; cl; cl = cl->next) {
-      if (parse_bridge_line(cl->value, 0)<0) {
+      if (parse_bridge_line(cl->value, 0, options)<0) {
         log_warn(LD_BUG,
                  "Previously validated Bridge line could not be added!");
         return -1;
@@ -3709,7 +3710,7 @@ options_validate(or_options_t *old_options, or_options_t *options,
 
   if (options->Bridges) {
     for (cl = options->Bridges; cl; cl = cl->next) {
-      if (parse_bridge_line(cl->value, 1)<0)
+      if (parse_bridge_line(cl->value, 1, options)<0)
         REJECT("Bridge line did not parse. See logs for details.");
     }
   }
@@ -4592,7 +4593,8 @@ options_init_logs(or_options_t *options, int validate_only)
  * <b>validate_only</b> is 0, and the line is well-formed, then add
  * the bridge described in the line to our internal bridge list. */
 static int
-parse_bridge_line(const char *line, int validate_only)
+parse_bridge_line(const char *line, int validate_only, 
+                  or_options_t *options)
 {
   smartlist_t *items = NULL;
   int r;
@@ -4616,6 +4618,12 @@ parse_bridge_line(const char *line, int validate_only)
   smartlist_del_keeporder(items, 0);
 
   if (!strstr(field1, ".")) { /* new-style bridge line */
+    if (!options->ClientTransportPlugin) {
+      log_warn(LD_CONFIG, "Pluggable transports protocol found "
+               "in bridge line, but no ClientTransportPlugin lines found.");
+      goto err;
+    }
+
     transport_name = field1;
     addrport = smartlist_get(items, 0);
     smartlist_del_keeporder(items, 0);
@@ -4649,8 +4657,10 @@ parse_bridge_line(const char *line, int validate_only)
     log_debug(LD_DIR, "Bridge at %s:%d with transport %s (%s)",
               fmt_addr(&addr), (int)port, transport_name,
               fingerprint ? fingerprint : "no key listed");
-    bridge_add_from_config(&addr, port,
-                           fingerprint ? digest : NULL, transport_name);
+
+    if (bridge_add_from_config(&addr, port,
+                               fingerprint ? digest : NULL,transport_name) < 0)
+      goto err;
   }
 
   r = 0;
@@ -4729,8 +4739,10 @@ parse_client_transport_line(const char *line, int validate_only)
   if (!validate_only) {
     log_debug(LD_DIR, "Transport %s found at %s:%d", name,
               fmt_addr(&addr), (int)port);
-    transport_add_from_config(&addr, port, name,
-                              socks_ver);
+
+    if (transport_add_from_config(&addr, port, name,
+                                  socks_ver) < 0)
+      goto err;
   }
 
   r = 0;
diff --git a/src/or/connection.c b/src/or/connection.c
index f7ad84a..898f242 100644
--- a/src/or/connection.c
+++ b/src/or/connection.c
@@ -4104,8 +4104,7 @@ assert_connection_ok(connection_t *conn, time_t now)
 /**
    Fills <b>addr</b> and <b>port</b> with the details of the proxy
    server of type 'proxy_type' we are using.
-   'conn' contains a connection_t and is used for finding pluggable
-   transports proxies.
+   'conn' contains the connection_t we are using the proxy for.
    
    Returns 1 if we were successfull, 0 if we are not using a proxy
    server and -1 if something went wrong.
@@ -4186,7 +4185,7 @@ log_failed_proxy_connection(connection_t *conn)
 }
 
 /**
-   Transforms 'proxy_type' to it's string representation/
+   Return string representation of <b>proxy_type</b>.
 */
 static const char *
 proxy_type_to_string(int proxy_type)
diff --git a/src/or/connection_or.c b/src/or/connection_or.c
index f111bc1..4ed4723 100644
--- a/src/or/connection_or.c
+++ b/src/or/connection_or.c
@@ -860,14 +860,17 @@ connection_or_connect(const tor_addr_t *_addr, uint16_t port,
   conn->_base.state = OR_CONN_STATE_CONNECTING;
   control_event_or_conn_status(conn, OR_CONN_EVENT_LAUNCHED, 0);
 
+  /* If we are using a proxy server, find it and use it. */
   proxy_type = get_proxy_type();
   r = get_proxy_addrport(proxy_type, &proxy_addr, &proxy_port, TO_CONN(conn));
   if (r == 1) { /* proxy found. */
     addr = proxy_addr;
     port = proxy_port;
     conn->_base.proxy_state = PROXY_INFANT;
-  } else if (r < 0)
+  } else if (r < 0) {
+    log_info(LD_PROTOCOL, "Failed on getting proxy addrport.");
     return NULL;
+  }
 
   switch (connection_connect(TO_CONN(conn), conn->_base.address,
                              &addr, port, &socket_error)) {





More information about the tor-commits mailing list