summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Kadianakis <desnacked@riseup.net>2012-06-25 18:30:15 +0300
committerNick Mathewson <nickm@torproject.org>2012-06-25 13:19:22 -0400
commit53e4452f985cad0947cd8ebfa0a1c198b6a7da7d (patch)
tree2a2519e00be99a5c01dce692f2105e3c56889e4a
parent2703e072a1056edd3b68a16e045175e5bd268301 (diff)
downloadtor-53e4452f985cad0947cd8ebfa0a1c198b6a7da7d.tar.gz
tor-53e4452f985cad0947cd8ebfa0a1c198b6a7da7d.zip
Don't do DNS lookups when parsing corrupted managed proxy messages.
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.
-rw-r--r--changes/bug62263
-rw-r--r--src/or/transports.c30
2 files changed, 25 insertions, 8 deletions
diff --git a/changes/bug6226 b/changes/bug6226
new file mode 100644
index 0000000000..7cbee10fe7
--- /dev/null
+++ b/changes/bug6226
@@ -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.
diff --git a/src/or/transports.c b/src/or/transports.c
index e43ec6c480..4ba239562a 100644
--- a/src/or/transports.c
+++ b/src/or/transports.c
@@ -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;
}