aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Goulet <dgoulet@torproject.org>2020-07-09 07:27:25 -0400
committerDavid Goulet <dgoulet@torproject.org>2020-07-09 07:27:25 -0400
commit32a0bc2a84b0e73ab94e9428f9f8864bdc458444 (patch)
tree43decf412608fa0cb8cbf38ed2856b445b327870
parentd7f3d1196c7bf962125fdc165492623c12359679 (diff)
parent1af7f40dad505c506f2237262bc7c03fe7681820 (diff)
downloadtor-32a0bc2a84b0e73ab94e9428f9f8864bdc458444.tar.gz
tor-32a0bc2a84b0e73ab94e9428f9f8864bdc458444.zip
Merge branch 'maint-0.4.4'
-rw-r--r--changes/bug340843
-rw-r--r--src/feature/hs/hs_client.c36
2 files changed, 24 insertions, 15 deletions
diff --git a/changes/bug34084 b/changes/bug34084
new file mode 100644
index 0000000000..524c4cf68e
--- /dev/null
+++ b/changes/bug34084
@@ -0,0 +1,3 @@
+ o Minor bugfixes (onion services v3):
+ - Avoid a non-fatal assert log in an edge-case of opening an intro circuit
+ as a client. Fixes bug 34084; bugfix on 0.3.2.1-alpha.
diff --git a/src/feature/hs/hs_client.c b/src/feature/hs/hs_client.c
index 9670ed44b3..80f4fb8484 100644
--- a/src/feature/hs/hs_client.c
+++ b/src/feature/hs/hs_client.c
@@ -705,8 +705,11 @@ send_introduce1(origin_circuit_t *intro_circ,
}
/** Using the introduction circuit circ, setup the authentication key of the
- * intro point this circuit has extended to. */
-static void
+ * intro point this circuit has extended to.
+ *
+ * Return 0 if everything went well, otherwise return -1 in the case of errors.
+ */
+static int
setup_intro_circ_auth_key(origin_circuit_t *circ)
{
const hs_descriptor_t *desc;
@@ -720,27 +723,28 @@ setup_intro_circ_auth_key(origin_circuit_t *circ)
* and the client descriptor cache that gets purged (NEWNYM) or the
* cleaned up because it expired. Mark the circuit for close so a new
* descriptor fetch can occur. */
- circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL);
- goto end;
+ goto err;
}
/* We will go over every intro point and try to find which one is linked to
* that circuit. Those lists are small so it's not that expensive. */
ip = find_desc_intro_point_by_legacy_id(
circ->build_state->chosen_exit->identity_digest, desc);
- if (ip) {
- /* We got it, copy its authentication key to the identifier. */
- ed25519_pubkey_copy(&circ->hs_ident->intro_auth_pk,
- &ip->auth_key_cert->signed_key);
- goto end;
+ if (!ip) {
+ /* Reaching this point means we didn't find any intro point for this
+ * circuit which is not supposed to happen. */
+ log_info(LD_REND,"Could not match opened intro circuit with intro point.");
+ goto err;
}
- /* Reaching this point means we didn't find any intro point for this circuit
- * which is not supposed to happen. */
- tor_assert_nonfatal_unreached();
+ /* We got it, copy its authentication key to the identifier. */
+ ed25519_pubkey_copy(&circ->hs_ident->intro_auth_pk,
+ &ip->auth_key_cert->signed_key);
+ return 0;
- end:
- return;
+ err:
+ circuit_mark_for_close(TO_CIRCUIT(circ), END_CIRC_REASON_INTERNAL);
+ return -1;
}
/** Called when an introduction circuit has opened. */
@@ -755,7 +759,9 @@ client_intro_circ_has_opened(origin_circuit_t *circ)
/* This is an introduction circuit so we'll attach the correct
* authentication key to the circuit identifier so it can be identified
* properly later on. */
- setup_intro_circ_auth_key(circ);
+ if (setup_intro_circ_auth_key(circ) < 0) {
+ return;
+ }
connection_ap_attach_pending(1);
}