[tor-commits] [tor/master] pass the reason from the truncated cell to the controller
nickm at torproject.org
nickm at torproject.org
Thu Oct 4 13:55:34 UTC 2012
commit 10b43f4c46378c5d08aaba01ee00081c18002a44
Author: Roger Dingledine <arma at torproject.org>
Date: Wed Oct 3 23:56:34 2012 -0400
pass the reason from the truncated cell to the controller
(rather than just always declaring that the reason is
END_CIRC_REASON_OR_CONN_CLOSED)
resolves bug 7039.
---
changes/bug7039 | 7 +++++++
src/or/circuitbuild.c | 4 ++--
src/or/circuitbuild.h | 3 ++-
src/or/relay.c | 3 ++-
4 files changed, 13 insertions(+), 4 deletions(-)
diff --git a/changes/bug7039 b/changes/bug7039
new file mode 100644
index 0000000..dc5111a
--- /dev/null
+++ b/changes/bug7039
@@ -0,0 +1,7 @@
+ o Minor bugfixes:
+ - When a Tor client gets a "truncated" relay cell, the first byte of
+ its payload specifies why the circuit was truncated. We were
+ ignoring this 'reason' byte when tearing down the circuit, resulting
+ in the controller not being told why the circuit closed. Now we
+ pass the reason from the truncated cell to the controller. Bugfix
+ on 0.1.2.3-alpha; fixes bug 7039.
diff --git a/src/or/circuitbuild.c b/src/or/circuitbuild.c
index 09eef64..be97b7c 100644
--- a/src/or/circuitbuild.c
+++ b/src/or/circuitbuild.c
@@ -2999,7 +2999,7 @@ circuit_finish_handshake(origin_circuit_t *circ, uint8_t reply_type,
* just give up: for circ to close, and return 0.
*/
int
-circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer)
+circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer, int reason)
{
// crypt_path_t *victim;
// connection_t *stream;
@@ -3012,7 +3012,7 @@ circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer)
* just give up.
*/
circuit_mark_for_close(TO_CIRCUIT(circ),
- END_CIRC_REASON_FLAG_REMOTE|END_CIRC_REASON_OR_CONN_CLOSED);
+ END_CIRC_REASON_FLAG_REMOTE|reason);
return 0;
#if 0
diff --git a/src/or/circuitbuild.h b/src/or/circuitbuild.h
index c3905ca..8ec48be 100644
--- a/src/or/circuitbuild.h
+++ b/src/or/circuitbuild.h
@@ -32,7 +32,8 @@ int circuit_init_cpath_crypto(crypt_path_t *cpath, const char *key_data,
int reverse);
int circuit_finish_handshake(origin_circuit_t *circ, uint8_t cell_type,
const uint8_t *reply);
-int circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer);
+int circuit_truncated(origin_circuit_t *circ, crypt_path_t *layer,
+ int reason);
int onionskin_answer(or_circuit_t *circ, uint8_t cell_type,
const char *payload, const char *keys);
int circuit_all_predicted_ports_handled(time_t now, int *need_uptime,
diff --git a/src/or/relay.c b/src/or/relay.c
index 54f6634..4a50b71 100644
--- a/src/or/relay.c
+++ b/src/or/relay.c
@@ -1251,7 +1251,8 @@ connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ,
"'truncated' unsupported at non-origin. Dropping.");
return 0;
}
- circuit_truncated(TO_ORIGIN_CIRCUIT(circ), layer_hint);
+ circuit_truncated(TO_ORIGIN_CIRCUIT(circ), layer_hint,
+ get_uint8(cell->payload + RELAY_HEADER_SIZE));
return 0;
case RELAY_COMMAND_CONNECTED:
if (conn) {
More information about the tor-commits
mailing list