[tor-commits] [tor/master] Check for orconns and use connection_or_close_for_error() when appropriate in connection_handle_write_impl()

nickm at torproject.org nickm at torproject.org
Wed Jul 16 14:58:52 UTC 2014


commit 65a0f895c7dd913071bcba5f1876ccf3b1286892
Author: Andrea Shepard <andrea at 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) {





More information about the tor-commits mailing list