aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorrl1987 <rl1987@sdf.lonestar.org>2016-01-06 14:47:35 +0100
committerrl1987 <rl1987@sdf.lonestar.org>2016-01-06 14:47:35 +0100
commit110765f5564a588c5f019d32b5e6f66cc7806c41 (patch)
treeae15547cb33c2cab469273c037d6b1a1c5c20fd0
parent7660471054e2ee6568ddbbadbd9190f9ca4efb5a (diff)
downloadtor-110765f5564a588c5f019d32b5e6f66cc7806c41.tar.gz
tor-110765f5564a588c5f019d32b5e6f66cc7806c41.zip
Use get_interface6_via_udp_socket_hack() properly in _list().
When _list() is called with AF_UNSPEC family and fails to enumerate network interfaces using platform specific API, have it call _hack() twice to find out IPv4 and/or IPv6 address of a machine Tor instance is running on. This is correct way to handle this case because _hack() can only be called with AF_INET and AF_INET6 and does not support any other address family.
-rw-r--r--changes/feature179516
-rw-r--r--src/common/address.c33
2 files changed, 29 insertions, 10 deletions
diff --git a/changes/feature17951 b/changes/feature17951
new file mode 100644
index 0000000000..42ec32a0dd
--- /dev/null
+++ b/changes/feature17951
@@ -0,0 +1,6 @@
+ o Minor features:
+ - When get_interface_address6_list(.,AF_UNSPEC,.) is called and fails
+ to enumerate interface addresses using the platform-specific API,
+ have it rely on the UDP socket fallback technique to try and find
+ out what IP addresses (both IPv4 and IPv6) our machine has. Resolves
+ ticket 17951.
diff --git a/src/common/address.c b/src/common/address.c
index 69a80986ed..e2d0eac955 100644
--- a/src/common/address.c
+++ b/src/common/address.c
@@ -1547,8 +1547,9 @@ tor_addr_is_multicast(const tor_addr_t *a)
}
/** Attempt to retrieve IP address of current host by utilizing some
- * UDP socket trickery. Only look for address of given <b>family</b>.
- * Set result to *<b>addr</b>. Return 0 on success, -1 on failure.
+ * UDP socket trickery. Only look for address of given <b>family</b>
+ * (only AF_INET and AF_INET6 are supported). Set result to *<b>addr</b>.
+ * Return 0 on success, -1 on failure.
*/
MOCK_IMPL(int,
get_interface_address6_via_udp_socket_hack,(int severity,
@@ -1720,15 +1721,27 @@ MOCK_IMPL(smartlist_t *,get_interface_address6_list,(int severity,
}
/* Okay, the smart way is out. */
- if (get_interface_address6_via_udp_socket_hack(severity,family,&addr))
- return smartlist_new();
- if (!include_internal && tor_addr_is_internal(&addr, 0)) {
- return smartlist_new();
- } else {
- addrs = smartlist_new();
- smartlist_add(addrs, tor_dup_addr(&addr));
- return addrs;
+ addrs = smartlist_new();
+
+ if (family == AF_INET || family == AF_UNSPEC) {
+ if (get_interface_address6_via_udp_socket_hack(severity,AF_INET,
+ &addr) == 0) {
+ if (include_internal || !tor_addr_is_internal(&addr, 0)) {
+ smartlist_add(addrs, tor_dup_addr(&addr));
+ }
+ }
}
+
+ if (family == AF_INET6 || family == AF_UNSPEC) {
+ if (get_interface_address6_via_udp_socket_hack(severity,AF_INET6,
+ &addr) == 0) {
+ if (include_internal || !tor_addr_is_internal(&addr, 0)) {
+ smartlist_add(addrs, tor_dup_addr(&addr));
+ }
+ }
+ }
+
+ return addrs;
}
/* ======