Browse Source

Merge branch 'bug7267' of ssh://git-rw.torproject.org/user/andrea/tor

Andrea Shepard 11 years ago
parent
commit
2cb82c33bc
3 changed files with 26 additions and 1 deletions
  1. 4 0
      changes/bug7267
  2. 13 0
      src/or/channel.c
  3. 9 1
      src/or/hibernate.c

+ 4 - 0
changes/bug7267

@@ -0,0 +1,4 @@
+ - Major bugfixes
+   o Call channel_mark_for_close() rather than connection_mark_for_close()
+     in hibernate_go_dormant() when closing an or_connection_t.  Fixes bug
+     7267.

+ 13 - 0
src/or/channel.c

@@ -1057,6 +1057,19 @@ channel_set_cell_handlers(channel_t *chan,
        chan->var_cell_handler)) channel_process_cells(chan);
 }
 
+/*
+ * On closing channels
+ *
+ * There are three functions that close channels, for use in
+ * different circumstances:
+ *
+ *  - Use channel_mark_for_close() for most cases
+ *  - Use channel_close_from_lower_layer() if you are connection_or.c
+ *    and the other end closes the underlying connection.
+ *  - Use channel_close_for_error() if you are connection_or.c and
+ *    some sort of error has occurred.
+ */
+
 /**
  * Mark a channel for closure
  *

+ 9 - 1
src/or/hibernate.c

@@ -23,6 +23,8 @@ hibernating, phase 2:
 
 #define HIBERNATE_PRIVATE
 #include "or.h"
+#include "channel.h"
+#include "channeltls.h"
 #include "config.h"
 #include "connection.h"
 #include "connection_edge.h"
@@ -846,7 +848,13 @@ hibernate_go_dormant(time_t now)
     if (conn->type == CONN_TYPE_AP) /* send socks failure if needed */
       connection_mark_unattached_ap(TO_ENTRY_CONN(conn),
                                     END_STREAM_REASON_HIBERNATING);
-    else
+    else if (conn->type == CONN_TYPE_OR) {
+      if (TO_OR_CONN(conn)->chan) {
+        channel_mark_for_close(TLS_CHAN_TO_BASE(TO_OR_CONN(conn)->chan));
+      } else {
+         connection_mark_for_close(conn);
+      }
+    } else
       connection_mark_for_close(conn);
   }