[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r10398: Add some code to mitigate bug 393: Choose at random from mul (in tor/trunk: . doc src/or)



Author: nickm
Date: 2007-05-29 14:58:16 -0400 (Tue, 29 May 2007)
New Revision: 10398

Modified:
   tor/trunk/
   tor/trunk/ChangeLog
   tor/trunk/doc/tor.1.in
   tor/trunk/src/or/rendservice.c
Log:
 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.



Property changes on: tor/trunk
___________________________________________________________________
 svk:merge ticket from /tor/trunk [r13068] on 8246c3cf-6607-4228-993b-4d95d33730f1

Modified: tor/trunk/ChangeLog
===================================================================
--- tor/trunk/ChangeLog	2007-05-29 18:39:59 UTC (rev 10397)
+++ tor/trunk/ChangeLog	2007-05-29 18:58:16 UTC (rev 10398)
@@ -103,6 +103,12 @@
       to the AutomapHostsOnResolve option, this is no longer a completely
       silly thing to do.
 
+  o Minor features (hidden services):
+    - Allow multiple HiddenServeicePort directives with the same virtual
+      port; when they occur, the user is sent round-robin to one
+      of the target ports chosen at random.  Partially fixes bug 393 by
+      adding limited ad-hoc round-robining.
+
   o Minor features (other):
     - More unit tests.
     - Add a new AutomapHostsOnResolve option: when it is enabled, any

Modified: tor/trunk/doc/tor.1.in
===================================================================
--- tor/trunk/doc/tor.1.in	2007-05-29 18:39:59 UTC (rev 10397)
+++ tor/trunk/doc/tor.1.in	2007-05-29 18:58:16 UTC (rev 10398)
@@ -981,7 +981,9 @@
 option multiple times; each time applies to the service using the most recent
 hiddenservicedir.  By default, this option maps the virtual port to the
 same port on 127.0.0.1.  You may override the target port, address, or both
-by specifying a target of addr, port, or addr:port.
+by specifying a target of addr, port, or addr:port.  You may also have
+multiple lines with the same VIRTPORT: when a user connects to that VIRTPORT,
+one of the TARGETs from those lines will be chosen at random.
 .LP
 .TP
 \fBHiddenServiceNodes \fR\fInickname\fR,\fInickname\fR,\fI...\fP

Modified: tor/trunk/src/or/rendservice.c
===================================================================
--- tor/trunk/src/or/rendservice.c	2007-05-29 18:39:59 UTC (rev 10397)
+++ tor/trunk/src/or/rendservice.c	2007-05-29 18:58:16 UTC (rev 10398)
@@ -1157,9 +1157,9 @@
                                       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 @@
              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);