summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Goulet <dgoulet@torproject.org>2020-09-18 12:22:23 -0400
committerNick Mathewson <nickm@torproject.org>2020-11-17 07:58:26 -0500
commita5538a36037641e49ca05aa3e90fec256794412b (patch)
tree16a83b7cf7e9d374d218ca5817fad63c7165a9a3
parent4b981407335865795bb99c7297ec49d80455d693 (diff)
downloadtor-a5538a36037641e49ca05aa3e90fec256794412b.tar.gz
tor-a5538a36037641e49ca05aa3e90fec256794412b.zip
relay: Look at our cache when looking for an IP change
Regularly, tor looks if its IP has changed. It does the entire auto discovery process again. However, it is possible that it does not find anything. Instead of thinking the IP changed to an unknown address, look at our cache and see if that value has changed. The reason for this is because if tor gets its address as a suggestion from a directory authority, it is because the auto discovery failed and thus that address should be consider for the IP change check. Related to #40071 Signed-off-by: David Goulet <dgoulet@torproject.org>
-rw-r--r--src/feature/relay/router.c17
1 files changed, 15 insertions, 2 deletions
diff --git a/src/feature/relay/router.c b/src/feature/relay/router.c
index 29103ed6c6..259c38f162 100644
--- a/src/feature/relay/router.c
+++ b/src/feature/relay/router.c
@@ -2679,8 +2679,21 @@ check_descriptor_ipaddress_changed(time_t now)
/* Ignore returned value because we want to notice not only an address
* change but also if an address is lost (current == UNSPEC). */
- find_my_address(get_options(), family, LOG_INFO, &current, &method,
- &hostname);
+ bool found = find_my_address(get_options(), family, LOG_INFO, &current,
+ &method, &hostname);
+ if (!found) {
+ /* Address was possibly not found because it is simply not configured or
+ * discoverable. Fallback to our cache, which includes any suggestion
+ * sent by a trusted directory server. */
+ found = relay_find_addr_to_publish(get_options(), family,
+ RELAY_FIND_ADDR_CACHE_ONLY,
+ &current);
+ }
+
+ /* The "current" address might be UNSPEC meaning it was not discovered nor
+ * found in our current cache. If we had an address before and we have
+ * none now, we consider this an IP change since it appears the relay lost
+ * its address. */
if (!tor_addr_eq(previous, &current)) {
char *source;