tor

The Tor anonymity network
git clone https://git.dasho.dev/tor.git
Log | Files | Refs | README | LICENSE

commit 698629f5a9eca21e0251f5d249f176a00aebf871
parent 8a0b7414870d2e0ddf90db8184b36be7309bd5c1
Author: Nick Mathewson <nickm@torproject.org>
Date:   Tue, 16 Oct 2018 17:29:50 -0400

Merge remote-tracking branch 'tor-github/pr/404'

Diffstat:
Achanges/bug27928 | 4++++
Msrc/core/mainloop/connection.c | 10++++++++++
2 files changed, 14 insertions(+), 0 deletions(-)

diff --git a/changes/bug27928 b/changes/bug27928 @@ -0,0 +1,4 @@ + o Minor bugfixes (networking): + - Refrain from attempting socket rebinding when old + and new listeners are in different address families. + Fixes bug 27928; bugfix on 0.3.5.1-alpha. diff --git a/src/core/mainloop/connection.c b/src/core/mainloop/connection.c @@ -2797,7 +2797,17 @@ retry_listener_ports(smartlist_t *old_conns, break; } #ifdef ENABLE_LISTENER_REBIND + /* Rebinding may be needed if all of the following are true: + * 1) Address family is the same in old and new listeners. + * 2) Port number matches exactly (numeric value is the same). + * 3) *One* of listeners (either old one or new one) has a + * wildcard IP address (0.0.0.0 or [::]). + * + * These are the exact conditions for a first bind() syscall + * to fail with EADDRINUSE. + */ const int may_need_rebind = + tor_addr_family(&wanted->addr) == tor_addr_family(&conn->addr) && port_matches_exact && bool_neq(tor_addr_is_null(&wanted->addr), tor_addr_is_null(&conn->addr)); if (replacements && may_need_rebind) {