[tor-bugs] #12377 [Core Tor/Tor]: get_interface_address6() behaviour iff all interface addresses are internal

Tor Bug Tracker & Wiki blackhole at torproject.org
Wed Mar 28 15:43:21 UTC 2018


#12377: get_interface_address6() behaviour iff all interface addresses are internal
-------------------------------------------------+-------------------------
 Reporter:  rl1987                               |          Owner:  (none)
     Type:  defect                               |         Status:
                                                 |  needs_revision
 Priority:  Medium                               |      Milestone:  Tor:
                                                 |  0.3.4.x-final
Component:  Core Tor/Tor                         |        Version:
 Severity:  Normal                               |     Resolution:
 Keywords:  tor-relay, address-detection,        |  Actual Points:
  review-group-34                                |
Parent ID:                                       |         Points:  1
 Reviewer:  dgoulet                              |        Sponsor:
-------------------------------------------------+-------------------------
Changes (by teor):

 * status:  merge_ready => needs_revision
 * version:  Tor: unspecified =>


Comment:

 Functional review:

 This code breaks the calls to get_interface_address() and
 get_interface_address6() in resolve_my_address(), because they rely on its
 promise to "Prefer public IP addresses to internal IP addresses." But this
 code will return a private IP addres if it is the default route.

 I'm also not sure how this code fixes the actual bug we are trying to fix.
 We already keep a list of interface addresses in
 client_check_address_changed(), as suggested by dgoulet in comment 4.

 One simple way to make the existing address check more reliable is to make
 get_interface_address6() return the *first* internal address in the list,
 not the *last* internal address. We should make this change anyway,
 because it will benefit macOS, BSD, and Windows.

 Design review:

 I don't understand the overall design of this API.

 If netlink works, we should use it to produce an ordered list of IP
 addresses, which has the default gateway as the first entry. Then we
 should use the first entry when a single address is requested, and all
 entries when a list of addresses is requested. The existing code already
 implements this logic for the other address resolution methods. To use the
 existing code, we need to make the netlink code return a list, and use
 that list as the first alternative in get_interface_addresses_raw().

 Also, this code only deals with the Linux case. Please open tickets for
 BSD/macOS and Windows functionality if you want to close this ticket.

 Merging this code may break some relay address configs, because it changes
 address resolution order to use netlink rather than the first address
 returned by getifaddrs(). So we need to write a note to relay operators at
 the top of the 0.3.4 release notes.

 Code review:

 Why check the `__linux__` macro, when you can just check for the relevant
 headers?

 Some of the functions are missing comments.

 This code never changes the value of ret, the logic is probably inverted.
 Please check for other instances of this bug.
 {{{
 if (ret == 0 && result.found)
     ret = 0;
 }}}

--
Ticket URL: <https://trac.torproject.org/projects/tor/ticket/12377#comment:40>
Tor Bug Tracker & Wiki <https://trac.torproject.org/>
The Tor Project: anonymity online


More information about the tor-bugs mailing list