summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Goulet <dgoulet@torproject.org>2018-01-19 16:21:55 -0500
committerDavid Goulet <dgoulet@torproject.org>2018-01-19 16:21:55 -0500
commitf98f7ca89865d1a477fc65165b92c86b9d8437fa (patch)
tree244995fb98017b7505b386449688dcf0f526d2c0
parentf406b9df0533c9730b4537b39f3a7f8d232f3558 (diff)
parent490ae26b24a6b2b8843515425cedabf99801163a (diff)
downloadtor-f98f7ca89865d1a477fc65165b92c86b9d8437fa.tar.gz
tor-f98f7ca89865d1a477fc65165b92c86b9d8437fa.zip
Merge branch 'bug24895_029_02' into bug24895_031_02
-rw-r--r--changes/bug248958
-rw-r--r--src/or/hs_common.c17
-rw-r--r--src/or/hs_common.h1
-rw-r--r--src/or/hs_service.c1
-rw-r--r--src/or/rendservice.c10
5 files changed, 35 insertions, 2 deletions
diff --git a/changes/bug24895 b/changes/bug24895
new file mode 100644
index 0000000000..7edde94a0b
--- /dev/null
+++ b/changes/bug24895
@@ -0,0 +1,8 @@
+ o Major bugfixes (onion services):
+ - Fix an "off by 2" error in counting rendezvous failures on the onion
+ service side. While we thought we would stop the rendezvous attempt
+ after one failed circuit, we were actually making three circuit attempts
+ before giving up. Now switch to a default of 2, and allow the consensus
+ parameter "hs_service_max_rdv_failures" to override. Fixes bug 24895;
+ bugfix on 0.0.6.
+
diff --git a/src/or/hs_common.c b/src/or/hs_common.c
index 7cef5a8e2c..c9af3f6887 100644
--- a/src/or/hs_common.c
+++ b/src/or/hs_common.c
@@ -344,3 +344,20 @@ rend_data_get_pk_digest(const rend_data_t *rend_data, size_t *len_out)
}
}
+/* Default, minimum and maximum values for the maximum rendezvous failures
+ * consensus parameter. */
+#define MAX_REND_FAILURES_DEFAULT 2
+#define MAX_REND_FAILURES_MIN 1
+#define MAX_REND_FAILURES_MAX 10
+
+/** How many times will a hidden service operator attempt to connect to
+ * a requested rendezvous point before giving up? */
+int
+hs_get_service_max_rend_failures(void)
+{
+ return networkstatus_get_param(NULL, "hs_service_max_rdv_failures",
+ MAX_REND_FAILURES_DEFAULT,
+ MAX_REND_FAILURES_MIN,
+ MAX_REND_FAILURES_MAX);
+}
+
diff --git a/src/or/hs_common.h b/src/or/hs_common.h
index a8fded652a..7eef5fc97e 100644
--- a/src/or/hs_common.h
+++ b/src/or/hs_common.h
@@ -52,6 +52,7 @@
int hs_check_service_private_dir(const char *username, const char *path,
unsigned int dir_group_readable,
unsigned int create);
+int hs_get_service_max_rend_failures(void);
void rend_data_free(rend_data_t *data);
rend_data_t *rend_data_dup(const rend_data_t *data);
diff --git a/src/or/hs_service.c b/src/or/hs_service.c
index 205ef11c92..b3eec13046 100644
--- a/src/or/hs_service.c
+++ b/src/or/hs_service.c
@@ -11,6 +11,7 @@
#include "rendservice.h"
#include "circuitlist.h"
#include "circpathbias.h"
+#include "networkstatus.h"
#include "hs_intropoint.h"
#include "hs_service.h"
diff --git a/src/or/rendservice.c b/src/or/rendservice.c
index b1e8a2f0cd..2a3594918e 100644
--- a/src/or/rendservice.c
+++ b/src/or/rendservice.c
@@ -2159,7 +2159,8 @@ rend_service_receive_introduction(origin_circuit_t *circuit,
/* Launch a circuit to the client's chosen rendezvous point.
*/
- for (i=0;i<MAX_REND_FAILURES;i++) {
+ int max_rend_failures=hs_get_service_max_rend_failures();
+ for (i=0;i<max_rend_failures;i++) {
int flags = CIRCLAUNCH_NEED_CAPACITY | CIRCLAUNCH_IS_INTERNAL;
if (circ_needs_uptime) flags |= CIRCLAUNCH_NEED_UPTIME;
/* A Single Onion Service only uses a direct connection if its
@@ -3067,8 +3068,13 @@ rend_service_relaunch_rendezvous(origin_circuit_t *oldcirc)
}
oldcirc->hs_service_side_rend_circ_has_been_relaunched = 1;
+ /* We check failure_count >= hs_get_service_max_rend_failures()-1 below, and
+ * the -1 is because we increment the failure count for our current failure
+ * *after* this clause. */
+ int max_rend_failures = hs_get_service_max_rend_failures() - 1;
+
if (!oldcirc->build_state ||
- oldcirc->build_state->failure_count > MAX_REND_FAILURES ||
+ oldcirc->build_state->failure_count >= max_rend_failures ||
oldcirc->build_state->expiry_time < time(NULL)) {
log_info(LD_REND,
"Attempt to build circuit to %s for rendezvous has failed "