[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

[or-cvs] r17626: {tor} minimal (i think) backport of r17625 (in tor/branches/tor-0_2_0-patches: . src/or)



Author: arma
Date: 2008-12-14 15:02:00 -0500 (Sun, 14 Dec 2008)
New Revision: 17626

Modified:
   tor/branches/tor-0_2_0-patches/ChangeLog
   tor/branches/tor-0_2_0-patches/src/or/relay.c
Log:
minimal (i think) backport of r17625


Modified: tor/branches/tor-0_2_0-patches/ChangeLog
===================================================================
--- tor/branches/tor-0_2_0-patches/ChangeLog	2008-12-14 19:40:56 UTC (rev 17625)
+++ tor/branches/tor-0_2_0-patches/ChangeLog	2008-12-14 20:02:00 UTC (rev 17626)
@@ -1,4 +1,12 @@
 Changes in version 0.2.0.33 - 200?-??-??
+  o Major bugfixes:
+    - When a stream at an exit relay is in state "resolving" or
+      "connecting" and it receives an "end" relay cell, the exit relay
+      would silently ignore the end cell and not close the stream. If
+      the client never closes the circuit, then the exit relay never
+      closes the TCP connection. Bug introduced in Tor 0.1.2.1-alpha;
+      reported by "wood".
+
   o Minor bugfixes:
     - Do not mark smartlist_bsearch_idx() function as ATTR_PURE.  This bug
       could make gcc generate non-functional binary search code. Bugfix

Modified: tor/branches/tor-0_2_0-patches/src/or/relay.c
===================================================================
--- tor/branches/tor-0_2_0-patches/src/or/relay.c	2008-12-14 19:40:56 UTC (rev 17625)
+++ tor/branches/tor-0_2_0-patches/src/or/relay.c	2008-12-14 20:02:00 UTC (rev 17626)
@@ -890,8 +890,14 @@
       return connection_edge_process_end_not_open(rh, cell,
                                                  TO_ORIGIN_CIRCUIT(circ), conn,
                                                  layer_hint);
-    else
+    else {
+      /* we just got an 'end', don't need to send one */
+      conn->_base.edge_has_sent_end = 1;
+      conn->end_reason = *(cell->payload+RELAY_HEADER_SIZE) |
+                         END_STREAM_REASON_FLAG_REMOTE;
+      connection_mark_for_close(TO_CONN(conn));
       return 0;
+    }
   }
 
   if (conn->_base.type == CONN_TYPE_AP &&