Ver código fonte

Check for orconns and use connection_or_close_for_error() when appropriate in connection_handle_write_impl()

Andrea Shepard 10 anos atrás
pai
commit
65a0f895c7
2 arquivos alterados com 13 adições e 3 exclusões
  1. 4 0
      changes/bug11302
  2. 9 3
      src/or/connection.c

+ 4 - 0
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.

+ 9 - 3
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) {