summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--changes/bug338994
-rw-r--r--src/core/or/connection_or.c14
2 files changed, 15 insertions, 3 deletions
diff --git a/changes/bug33899 b/changes/bug33899
index 319df45dff..b9b7d7cf13 100644
--- a/changes/bug33899
+++ b/changes/bug33899
@@ -3,3 +3,7 @@
In 17604, relays assumed that a remote relay could consider an IPv6
connection canonical, but did not set the canonical flag on their side
of the connection. Fixes bug 33899; bugfix on 0.3.1.1-alpha.
+ - Log IPv6 addresses on connections where this relay is the responder.
+ Previously, responding relays would replace the remote IPv6 address with
+ the IPv4 address from the consensus.
+ Fixes bug 33899; bugfix on 0.3.1.1-alpha.
diff --git a/src/core/or/connection_or.c b/src/core/or/connection_or.c
index 2eecbc50a7..f059bae25d 100644
--- a/src/core/or/connection_or.c
+++ b/src/core/or/connection_or.c
@@ -909,6 +909,13 @@ connection_or_check_canonicity(or_connection_t *conn, int started_here)
tor_addr_eq(&conn->base_.addr, &node_ipv6_ap.addr)) {
connection_or_set_canonical(conn, 1);
}
+ /* Choose the correct canonical address and port. */
+ tor_addr_port_t *node_ap;
+ if (tor_addr_family(&conn->base_.addr) == AF_INET) {
+ node_ap = &node_ipv4_ap;
+ } else {
+ node_ap = &node_ipv6_ap;
+ }
if (!started_here) {
/* Override the addr/port, so our log messages will make sense.
* This is dangerous, since if we ever try looking up a conn by
@@ -920,13 +927,14 @@ connection_or_check_canonicity(or_connection_t *conn, int started_here)
* right IP address and port 56244, that wouldn't be as helpful. now we
* log the "right" port too, so we know if it's moria1 or moria2.
*/
- tor_addr_copy(&conn->base_.addr, &node_ap.addr);
- conn->base_.port = node_ap.port;
+ /* See #33898 for a ticket that resolves this technical debt. */
+ tor_addr_copy(&conn->base_.addr, &node_ap->addr);
+ conn->base_.port = node_ap->port;
}
tor_free(conn->nickname);
conn->nickname = tor_strdup(node_get_nickname(r));
tor_free(conn->base_.address);
- conn->base_.address = tor_addr_to_str_dup(&node_ap.addr);
+ conn->base_.address = tor_addr_to_str_dup(&node_ap->addr);
} else {
tor_free(conn->nickname);
conn->nickname = tor_malloc(HEX_DIGEST_LEN+2);