Look at the right errno when sending reason for connect() failure

In afe414 (tor-0.1.0.1-rc~173), when we moved to
connection_edge_end_errno(), we used it in handling errors from
connection_connect().  That's not so good, since by the time
connection_connect() returns, the socket is no longer set, and we're
supposed to be looking at the socket_errno return value from
connection_connect() instead.  So do what we should've done, and
look at the socket_errno value that we get from connection_connect().
This commit is contained in:
Nick Mathewson 2011-03-25 16:14:42 -04:00
parent 05887f10ff
commit 6a5b94de6c
2 changed files with 10 additions and 4 deletions

View File

@ -0,0 +1,6 @@
o Minor bugfixes:
- Be more careful about reporting the correct error from a failed
connect() operation. Under some circumstances, it was possible to
look at an incorrect value for errno when sending the end reason.
Bugfix on Tor-0.1.0.1-rc.

View File

@ -2823,13 +2823,13 @@ connection_exit_connect(edge_connection_t *edge_conn)
log_debug(LD_EXIT,"about to try connecting"); log_debug(LD_EXIT,"about to try connecting");
switch (connection_connect(conn, conn->address, addr, port, &socket_error)) { switch (connection_connect(conn, conn->address, addr, port, &socket_error)) {
case -1: case -1: {
/* XXX022 use socket_error below rather than trying to piece things int reason = errno_to_stream_end_reason(socket_error);
* together from the current errno, which may have been clobbered. */ connection_edge_end(edge_conn, reason);
connection_edge_end_errno(edge_conn);
circuit_detach_stream(circuit_get_by_edge_conn(edge_conn), edge_conn); circuit_detach_stream(circuit_get_by_edge_conn(edge_conn), edge_conn);
connection_free(conn); connection_free(conn);
return; return;
}
case 0: case 0:
conn->state = EXIT_CONN_STATE_CONNECTING; conn->state = EXIT_CONN_STATE_CONNECTING;