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.
This commit is contained in:
rl1987
2016-01-06 14:47:35 +01:00
parent 7660471054
commit 110765f556
2 changed files with 29 additions and 10 deletions
+6
View File
@@ -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.
+23 -10
View File
@@ -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;
}
/* ======