|
@@ -77,54 +77,20 @@ static void connection_or_change_state(or_connection_t *conn, uint8_t state);
|
|
|
|
|
|
/**************************************************************/
|
|
|
|
|
|
-/** Map from identity digest of connected OR or desired OR to a connection_t
|
|
|
- * with that identity digest. If there is more than one such connection_t,
|
|
|
- * they form a linked list, with next_with_same_id as the next pointer. */
|
|
|
-static digestmap_t *orconn_identity_map = NULL; // XXXX 15056 disused.
|
|
|
-
|
|
|
/** Global map between Extended ORPort identifiers and OR
|
|
|
* connections. */
|
|
|
static digestmap_t *orconn_ext_or_id_map = NULL;
|
|
|
|
|
|
-/** If conn is listed in orconn_identity_map, remove it, and clear
|
|
|
- * conn->identity_digest. Otherwise do nothing. */
|
|
|
+/** Clear clear conn->identity_digest and update other data
|
|
|
+ * structures as appropriate.*/
|
|
|
void
|
|
|
connection_or_remove_from_identity_map(or_connection_t *conn)
|
|
|
{
|
|
|
- or_connection_t *tmp;
|
|
|
tor_assert(conn);
|
|
|
- if (!orconn_identity_map)
|
|
|
- return;
|
|
|
- tmp = digestmap_get(orconn_identity_map, conn->identity_digest);
|
|
|
- if (!tmp) {
|
|
|
- if (!tor_digest_is_zero(conn->identity_digest)) {
|
|
|
- log_warn(LD_BUG, "Didn't find connection '%s' on identity map when "
|
|
|
- "trying to remove it.",
|
|
|
- conn->nickname ? conn->nickname : "NULL");
|
|
|
- }
|
|
|
- return;
|
|
|
- }
|
|
|
- if (conn == tmp) {
|
|
|
- if (conn->next_with_same_id)
|
|
|
- digestmap_set(orconn_identity_map, conn->identity_digest,
|
|
|
- conn->next_with_same_id);
|
|
|
- else
|
|
|
- digestmap_remove(orconn_identity_map, conn->identity_digest);
|
|
|
- } else {
|
|
|
- while (tmp->next_with_same_id) {
|
|
|
- if (tmp->next_with_same_id == conn) {
|
|
|
- tmp->next_with_same_id = conn->next_with_same_id;
|
|
|
- break;
|
|
|
- }
|
|
|
- tmp = tmp->next_with_same_id;
|
|
|
- }
|
|
|
- }
|
|
|
memset(conn->identity_digest, 0, DIGEST_LEN);
|
|
|
- conn->next_with_same_id = NULL;
|
|
|
}
|
|
|
|
|
|
-/** Remove all entries from the identity-to-orconn map, and clear
|
|
|
- * all identities in OR conns.*/
|
|
|
+/** Clear all identities in OR conns.*/
|
|
|
void
|
|
|
connection_or_clear_identity_map(void)
|
|
|
{
|
|
@@ -134,12 +100,8 @@ connection_or_clear_identity_map(void)
|
|
|
if (conn->type == CONN_TYPE_OR) {
|
|
|
or_connection_t *or_conn = TO_OR_CONN(conn);
|
|
|
memset(or_conn->identity_digest, 0, DIGEST_LEN);
|
|
|
- or_conn->next_with_same_id = NULL;
|
|
|
}
|
|
|
});
|
|
|
-
|
|
|
- digestmap_free(orconn_identity_map, NULL);
|
|
|
- orconn_identity_map = NULL;
|
|
|
}
|
|
|
|
|
|
/** Change conn->identity_digest to digest, and add conn into
|
|
@@ -150,12 +112,9 @@ connection_or_set_identity_digest(or_connection_t *conn,
|
|
|
const ed25519_public_key_t *ed_id)
|
|
|
{
|
|
|
(void) ed_id; // DOCDOC // XXXX not implemented yet. 15056
|
|
|
- or_connection_t *tmp;
|
|
|
tor_assert(conn);
|
|
|
tor_assert(rsa_digest);
|
|
|
|
|
|
- if (!orconn_identity_map)
|
|
|
- orconn_identity_map = digestmap_new();
|
|
|
if (tor_memeq(conn->identity_digest, rsa_digest, DIGEST_LEN))
|
|
|
return;
|
|
|
|
|
@@ -172,20 +131,9 @@ connection_or_set_identity_digest(or_connection_t *conn,
|
|
|
if (tor_digest_is_zero(rsa_digest))
|
|
|
return;
|
|
|
|
|
|
- tmp = digestmap_set(orconn_identity_map, rsa_digest, conn);
|
|
|
- conn->next_with_same_id = tmp;
|
|
|
-
|
|
|
/* Deal with channels */
|
|
|
if (conn->chan)
|
|
|
channel_set_identity_digest(TLS_CHAN_TO_BASE(conn->chan), rsa_digest);
|
|
|
-
|
|
|
-#if 1
|
|
|
- /* Testing code to check for bugs in representation. */
|
|
|
- for (; tmp; tmp = tmp->next_with_same_id) {
|
|
|
- tor_assert(tor_memeq(tmp->identity_digest, rsa_digest, DIGEST_LEN));
|
|
|
- tor_assert(tmp != conn);
|
|
|
- }
|
|
|
-#endif
|
|
|
}
|
|
|
|
|
|
/** Remove the Extended ORPort identifier of <b>conn</b> from the
|