aboutsummaryrefslogtreecommitdiff
path: root/src/or/rendservice.c
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2007-05-29 18:58:16 +0000
committerNick Mathewson <nickm@torproject.org>2007-05-29 18:58:16 +0000
commit3f9afa06250febe954c8bcebbea3a21c398e89a1 (patch)
treed9dbc7a85e0fa5fe80dcc3bc819dad818d1ec694 /src/or/rendservice.c
parente11a92bd54926cfa8fd75c3a73d93ab2e1fbc007 (diff)
downloadtor-3f9afa06250febe954c8bcebbea3a21c398e89a1.tar
tor-3f9afa06250febe954c8bcebbea3a21c398e89a1.tar.gz
r13068@catbus: nickm | 2007-05-29 14:58:13 -0400
Add some code to mitigate bug 393: Choose at random from multiple hidden service ports with the same virtport. This allows limited ad-hoc round-robining. svn:r10398
Diffstat (limited to 'src/or/rendservice.c')
-rw-r--r--src/or/rendservice.c20
1 files changed, 13 insertions, 7 deletions
diff --git a/src/or/rendservice.c b/src/or/rendservice.c
index e20804438..937d40b5c 100644
--- a/src/or/rendservice.c
+++ b/src/or/rendservice.c
@@ -1157,9 +1157,9 @@ rend_service_set_connection_addr_port(edge_connection_t *conn,
origin_circuit_t *circ)
{
rend_service_t *service;
- int i;
- rend_service_port_config_t *p;
char serviceid[REND_SERVICE_ID_LEN+1];
+ smartlist_t *matching_ports;
+ rend_service_port_config_t *chosen_port;
tor_assert(circ->_base.purpose == CIRCUIT_PURPOSE_S_REND_JOINED);
log_debug(LD_REND,"beginning to hunt for addr/port");
@@ -1172,13 +1172,19 @@ rend_service_set_connection_addr_port(edge_connection_t *conn,
serviceid, circ->_base.n_circ_id);
return -1;
}
- for (i = 0; i < smartlist_len(service->ports); ++i) {
- p = smartlist_get(service->ports, i);
+ matching_ports = smartlist_create();
+ SMARTLIST_FOREACH(service->ports, rend_service_port_config_t *, p,
+ {
if (conn->_base.port == p->virtual_port) {
- conn->_base.addr = p->real_addr;
- conn->_base.port = p->real_port;
- return 0;
+ smartlist_add(matching_ports, p);
}
+ });
+ chosen_port = smartlist_choose(matching_ports);
+ smartlist_free(matching_ports);
+ if (chosen_port) {
+ conn->_base.addr = chosen_port->real_addr;
+ conn->_base.port = chosen_port->real_port;
+ return 0;
}
log_info(LD_REND, "No virtual port mapping exists for port %d on service %s",
conn->_base.port,serviceid);