diff options
author | Nick Mathewson <nickm@torproject.org> | 2012-05-24 16:57:36 -0400 |
---|---|---|
committer | Nick Mathewson <nickm@torproject.org> | 2012-05-24 16:57:36 -0400 |
commit | 9d41629aa072b389332273a21926260c302b49e1 (patch) | |
tree | 9f68fd91ea568ccf2ab685b28d46bf550e4a08d7 | |
parent | 75fc4dbbcabaedc715f0f9e883ccab1c9634e787 (diff) | |
download | tor-9d41629aa072b389332273a21926260c302b49e1.tar.gz tor-9d41629aa072b389332273a21926260c302b49e1.zip |
Delay getsockname() call until after connect() is done
On Windows, getsockname() on a nonblocking apparently won't work
until the connection is done connecting. On XP, it seems to fail by
reporting success and declaring that your address is INADDR_ANY. On the
Win8 preview, though, it fails more loudly and says WSAEINVAL.
Fix for bug 5374; bugfix on 0.1.1.14-alpha.
-rw-r--r-- | changes/bug5374 | 7 | ||||
-rw-r--r-- | src/or/connection.c | 11 |
2 files changed, 15 insertions, 3 deletions
diff --git a/changes/bug5374 b/changes/bug5374 new file mode 100644 index 0000000000..926a074903 --- /dev/null +++ b/changes/bug5374 @@ -0,0 +1,7 @@ + o Minor bugfixes: + + - Don't check for whether the address we're using for outbound + connections has changed until after the outbound connection has + completed. On Windows, getsockname() doesn't succeed until the + connection is finished. Fix for bug 5374; bugfix on + 0.1.1.14-alpha. diff --git a/src/or/connection.c b/src/or/connection.c index dc75601ab4..96f8d458ad 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -1393,9 +1393,6 @@ connection_connect(connection_t *conn, const char *address, } } - if (!server_mode(options)) - client_check_address_changed(s); - /* it succeeded. we're connected. */ log_fn(inprogress?LOG_DEBUG:LOG_INFO, LD_NET, "Connection to %s:%u %s (sock %d).", @@ -3434,6 +3431,14 @@ static int connection_finished_connecting(connection_t *conn) { tor_assert(conn); + + if (!server_mode(get_options())) { + /* See whether getsockname() says our address changed. We need to do this + * now that the connection has finished, because getsockname() on Windows + * won't work until then. */ + client_check_address_changed(conn->s); + } + switch (conn->type) { case CONN_TYPE_OR: |