[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