aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGeorge Kadianakis <desnacked@gmail.com>2011-06-14 16:00:55 +0200
committerGeorge Kadianakis <desnacked@gmail.com>2011-06-14 16:00:55 +0200
commit93526cdf0b9a9df1bcb69454060d24d819c15024 (patch)
treefc1e988967e27e4cd6258b895dbc581ef1f43cbe /src
parent5b050a9b08fa81421d7e923ef04d06b569f5f742 (diff)
downloadtor-93526cdf0b9a9df1bcb69454060d24d819c15024.tar
tor-93526cdf0b9a9df1bcb69454060d24d819c15024.tar.gz
Fixes small bugs.
Diffstat (limited to 'src')
-rw-r--r--src/or/circuitbuild.c50
-rw-r--r--src/or/circuitbuild.h4
-rw-r--r--src/or/config.c28
-rw-r--r--src/or/connection.c5
-rw-r--r--src/or/connection_or.c5
5 files changed, 72 insertions, 20 deletions
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index 4dcc685bc..53a3063c5 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 c1833d23e..9e05d6e14 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 47702873b..a78252c6c 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 f7ad84a08..898f242f7 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 f111bc12d..4ed4723fe 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)) {