commit 65a0f895c7dd913071bcba5f1876ccf3b1286892 Author: Andrea Shepard andrea@torproject.org Date: Tue Apr 15 23:03:16 2014 -0700
Check for orconns and use connection_or_close_for_error() when appropriate in connection_handle_write_impl() --- changes/bug11302 | 4 ++++ src/or/connection.c | 12 +++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-)
diff --git a/changes/bug11302 b/changes/bug11302 new file mode 100644 index 0000000..7416c69 --- /dev/null +++ b/changes/bug11302 @@ -0,0 +1,4 @@ + o Bugfixes: + - Check for orconns and use connection_or_close_for_error() rather than + connection_mark_for_close() directly in the getsockopt() failure case + of connection_handle_write_impl(). Fixes bug #11302. diff --git a/src/or/connection.c b/src/or/connection.c index 1be4c45..33b7d31 100644 --- a/src/or/connection.c +++ b/src/or/connection.c @@ -3705,9 +3705,15 @@ connection_handle_write_impl(connection_t *conn, int force) if (connection_state_is_connecting(conn)) { if (getsockopt(conn->s, SOL_SOCKET, SO_ERROR, (void*)&e, &len) < 0) { log_warn(LD_BUG, "getsockopt() syscall failed"); - if (CONN_IS_EDGE(conn)) - connection_edge_end_errno(TO_EDGE_CONN(conn)); - connection_mark_for_close(conn); + if (conn->type == CONN_TYPE_OR) { + or_connection_t *orconn = TO_OR_CONN(conn); + connection_or_close_for_error(orconn, 0); + } else { + if (CONN_IS_EDGE(conn)) { + connection_edge_end_errno(TO_EDGE_CONN(conn)); + } + connection_mark_for_close(conn); + } return -1; } if (e) {
tor-commits@lists.torproject.org