]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
Don't do DNS lookups when parsing corrupted managed proxy messages.
authorGeorge Kadianakis <desnacked@riseup.net>
Mon, 25 Jun 2012 15:30:15 +0000 (18:30 +0300)
committerNick Mathewson <nickm@torproject.org>
Mon, 25 Jun 2012 17:19:22 +0000 (13:19 -0400)
The functions parse_{s,c}method_line() were using
tor_addr_port_lookup() which is capable of doing DNS lookups. DNS
lookups should not be necessary when parsing {C,S}METHOD lines.

changes/bug6226 [new file with mode: 0644]
src/or/transports.c

diff --git a/changes/bug6226 b/changes/bug6226
new file mode 100644 (file)
index 0000000..7cbee10
--- /dev/null
@@ -0,0 +1,3 @@
+  o Minor bugfixes:
+    - Don't do DNS lookups when parsing corrupted managed proxy
+      protocol messages. Fixes bug 6226; bugfix on 0.2.3.6-alpha.
index e43ec6c4809af516b580f77bd7296609d6ab42a3..4ba239562a65465156403c3cf2c7ddea627e0b91 100644 (file)
@@ -790,7 +790,8 @@ parse_smethod_line(const char *line, managed_proxy_t *mp)
   char *method_name=NULL;
 
   char *addrport=NULL;
-  tor_addr_t addr;
+  tor_addr_t tor_addr;
+  char *address=NULL;
   uint16_t port = 0;
 
   transport_t *transport=NULL;
@@ -814,7 +815,7 @@ parse_smethod_line(const char *line, managed_proxy_t *mp)
   }
 
   addrport = smartlist_get(items, 2);
-  if (tor_addr_port_lookup(addrport, &addr, &port)<0) {
+  if (tor_addr_port_split(LOG_PROTOCOL_WARN, addrport, &address, &port)<0) {
     log_warn(LD_CONFIG, "Error parsing transport "
              "address '%s'", addrport);
     goto err;
@@ -826,7 +827,12 @@ parse_smethod_line(const char *line, managed_proxy_t *mp)
     goto err;
   }
 
-  transport = transport_new(&addr, port, method_name, PROXY_NONE);
+  if (tor_addr_parse(&tor_addr, address) < 0) {
+    log_warn(LD_CONFIG, "Error parsing transport address '%s'", address);
+    goto err;
+  }
+
+  transport = transport_new(&tor_addr, port, method_name, PROXY_NONE);
   if (!transport)
     goto err;
 
@@ -835,7 +841,7 @@ parse_smethod_line(const char *line, managed_proxy_t *mp)
   /* For now, notify the user so that he knows where the server
      transport is listening. */
   log_info(LD_CONFIG, "Server transport %s at %s:%d.",
-           method_name, fmt_addr(&addr), (int)port);
+           method_name, address, (int)port);
 
   r=0;
   goto done;
@@ -846,6 +852,7 @@ parse_smethod_line(const char *line, managed_proxy_t *mp)
  done:
   SMARTLIST_FOREACH(items, char*, s, tor_free(s));
   smartlist_free(items);
+  tor_free(address);
   return r;
 }
 
@@ -863,7 +870,8 @@ parse_cmethod_line(const char *line, managed_proxy_t *mp)
   int socks_ver=PROXY_NONE;
 
   char *addrport=NULL;
-  tor_addr_t addr;
+  tor_addr_t tor_addr;
+  char *address=NULL;
   uint16_t port = 0;
 
   transport_t *transport=NULL;
@@ -899,7 +907,7 @@ parse_cmethod_line(const char *line, managed_proxy_t *mp)
   }
 
   addrport = smartlist_get(items, 3);
-  if (tor_addr_port_lookup(addrport, &addr, &port)<0) {
+  if (tor_addr_port_split(LOG_PROTOCOL_WARN, addrport, &address, &port)<0) {
     log_warn(LD_CONFIG, "Error parsing transport "
              "address '%s'", addrport);
     goto err;
@@ -911,7 +919,12 @@ parse_cmethod_line(const char *line, managed_proxy_t *mp)
     goto err;
   }
 
-  transport = transport_new(&addr, port, method_name, socks_ver);
+  if (tor_addr_parse(&tor_addr, address) < 0) {
+    log_warn(LD_CONFIG, "Error parsing transport address '%s'", address);
+    goto err;
+  }
+
+  transport = transport_new(&tor_addr, port, method_name, socks_ver);
   if (!transport)
     goto err;
 
@@ -919,7 +932,7 @@ parse_cmethod_line(const char *line, managed_proxy_t *mp)
 
   log_info(LD_CONFIG, "Transport %s at %s:%d with SOCKS %d. "
            "Attached to managed proxy.",
-           method_name, fmt_addr(&addr), (int)port, socks_ver);
+           method_name, address, (int)port, socks_ver);
 
   r=0;
   goto done;
@@ -930,6 +943,7 @@ parse_cmethod_line(const char *line, managed_proxy_t *mp)
  done:
   SMARTLIST_FOREACH(items, char*, s, tor_free(s));
   smartlist_free(items);
+  tor_free(address);
   return r;
 }