From 65a0f895c7dd913071bcba5f1876ccf3b1286892 Mon Sep 17 00:00:00 2001
From: Andrea Shepard <andrea@torproject.org>
Date: Tue, 15 Apr 2014 23:03:16 -0700
Subject: [PATCH] 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(-)
 create mode 100644 changes/bug11302

diff --git a/changes/bug11302 b/changes/bug11302
new file mode 100644
index 0000000000..7416c69be6
--- /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 1be4c45dd7..33b7d318ee 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) {
-- 
GitLab