aboutsummaryrefslogtreecommitdiff
path: root/src/or/circuitlist.c
diff options
context:
space:
mode:
authorMike Perry <mikeperry-git@fscked.org>2012-11-21 16:32:38 -0800
committerMike Perry <mikeperry-git@fscked.org>2012-12-07 15:28:38 -0800
commit721f7e375114abfcb1a41ade58ac59ec79b8a3af (patch)
treee59e2ec4222bbdb1af275fbf5a95b365ade1f705 /src/or/circuitlist.c
parent9b4046607232c636c58f04672c1b762968a8b023 (diff)
downloadtor-721f7e375114abfcb1a41ade58ac59ec79b8a3af.tar
tor-721f7e375114abfcb1a41ade58ac59ec79b8a3af.tar.gz
Fix a crash bug and pass down a remote reason code.
Unexpected channel closures count as remote circ failures.
Diffstat (limited to 'src/or/circuitlist.c')
-rw-r--r--src/or/circuitlist.c19
1 files changed, 15 insertions, 4 deletions
diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c
index 66cdbe10c..eb7fc7528 100644
--- a/src/or/circuitlist.c
+++ b/src/or/circuitlist.c
@@ -1038,8 +1038,13 @@ circuit_unlink_all_from_channel(channel_t *chan, int reason)
for (circ = global_circuitlist; circ; circ = circ->next) {
int mark = 0;
if (circ->n_chan == chan) {
- circuit_set_n_circid_chan(circ, 0, NULL);
- mark = 1;
+ circuit_set_n_circid_chan(circ, 0, NULL);
+ mark = 1;
+
+ /* If we didn't request this closure, pass the remote
+ * bit to mark_for_close. */
+ if (chan->reason_for_closing != CHANNEL_CLOSE_REQUESTED)
+ reason |= END_CIRC_REASON_FLAG_REMOTE;
}
if (! CIRCUIT_IS_ORIGIN(circ)) {
or_circuit_t *or_circ = TO_OR_CIRCUIT(circ);
@@ -1355,14 +1360,20 @@ circuit_mark_for_close_(circuit_t *circ, int reason, int line,
int pathbias_is_normal_close = 1;
/* FIXME: Is timestamp_dirty the right thing for these two checks?
- * Should we use isolation_any_streams_attached instead? */
+ * Should we use isolation_any_streams_attached instead?
+ * isolation_any_streams_attached is not used for hidservs.. */
if (!circ->timestamp_dirty) {
- if (reason & END_CIRC_REASON_FLAG_REMOTE) {
+ if (orig_reason & END_CIRC_REASON_FLAG_REMOTE) {
/* Unused remote circ close reasons all could be bias */
+ // XXX: We hit this a lot for hidserv circs with purposes:
+ // CIRCUIT_PURPOSE_S_CONNECT_REND (reasons: 514,517,520)
+ // CIRCUIT_PURPOSE_S_REND_JOINED (reasons: 514,517,520)
+ // == reasons: 2,3,8. Client-side timeouts?
pathbias_is_normal_close = 0;
pathbias_count_collapse(ocirc);
} else if ((reason & ~END_CIRC_REASON_FLAG_REMOTE)
== END_CIRC_REASON_CHANNEL_CLOSED &&
+ circ->n_chan &&
circ->n_chan->reason_for_closing
!= CHANNEL_CLOSE_REQUESTED) {
/* If we didn't close the channel ourselves, it could be bias */