aboutsummaryrefslogtreecommitdiff
path: root/src/or
diff options
context:
space:
mode:
authorNick Mathewson <nickm@torproject.org>2012-05-24 16:57:36 -0400
committerNick Mathewson <nickm@torproject.org>2012-05-24 16:57:36 -0400
commit9d41629aa072b389332273a21926260c302b49e1 (patch)
tree9f68fd91ea568ccf2ab685b28d46bf550e4a08d7 /src/or
parent75fc4dbbcabaedc715f0f9e883ccab1c9634e787 (diff)
downloadtor-9d41629aa072b389332273a21926260c302b49e1.tar
tor-9d41629aa072b389332273a21926260c302b49e1.tar.gz
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.
Diffstat (limited to 'src/or')
-rw-r--r--src/or/connection.c11
1 files changed, 8 insertions, 3 deletions
diff --git a/src/or/connection.c b/src/or/connection.c
index dc75601ab..96f8d458a 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: