aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorAndrea Shepard <andrea@torproject.org>2012-11-13 18:54:24 -0800
committerAndrea Shepard <andrea@torproject.org>2012-11-13 18:54:24 -0800
commit2cb82c33bcb59ce65c9738ff8ff4977f39fa3d9f (patch)
tree2d12bbafeb9287e14e805327a474a38bf7c3ed51 /src
parent02a43e5eb65a81e28765c2183c2b3087cf5882fe (diff)
parent3db3daa663e9fe41f87993f4580cf3a8e6bab27c (diff)
downloadtor-2cb82c33bcb59ce65c9738ff8ff4977f39fa3d9f.tar.gz
tor-2cb82c33bcb59ce65c9738ff8ff4977f39fa3d9f.zip
Merge branch 'bug7267' of ssh://git-rw.torproject.org/user/andrea/tor
Diffstat (limited to 'src')
-rw-r--r--src/or/channel.c13
-rw-r--r--src/or/hibernate.c10
2 files changed, 22 insertions, 1 deletions
diff --git a/src/or/channel.c b/src/or/channel.c
index 16dd9f903a..625d957811 100644
--- a/src/or/channel.c
+++ b/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
*
diff --git a/src/or/hibernate.c b/src/or/hibernate.c
index b33e5e216c..9e54eb4b4c 100644
--- a/src/or/hibernate.c
+++ b/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);
}