[tor-commits] [tor/master] When counting memory from closing a connection, count the dir conn too

nickm at torproject.org nickm at torproject.org
Sun Aug 24 17:09:46 UTC 2014


commit ec59167cae1f5b3057ed722857d78ec78239e991
Author: Nick Mathewson <nickm at torproject.org>
Date:   Mon Aug 18 15:21:50 2014 -0400

    When counting memory from closing a connection, count the dir conn too
    
    Fix part of bug 11972
---
 changes/bug11792     |    5 +++++
 src/or/circuitlist.c |   25 ++++++++++++++++++-------
 2 files changed, 23 insertions(+), 7 deletions(-)

diff --git a/changes/bug11792 b/changes/bug11792
new file mode 100644
index 0000000..1d38189
--- /dev/null
+++ b/changes/bug11792
@@ -0,0 +1,5 @@
+  o Minor features (security, OOM):
+    - When closing an edge connection because we've run out of memory,
+      also count the amount of memory that any tunnelled directory
+      connection attached to that connection had consumed. Part of
+      ticket 11792.
\ No newline at end of file
diff --git a/src/or/circuitlist.c b/src/or/circuitlist.c
index f3a8350..9aeb3eb 100644
--- a/src/or/circuitlist.c
+++ b/src/or/circuitlist.c
@@ -1799,6 +1799,21 @@ marked_circuit_free_cells(circuit_t *circ)
     cell_queue_clear(& TO_OR_CIRCUIT(circ)->p_chan_cells);
 }
 
+static size_t
+marked_circuit_single_conn_free_bytes(connection_t *conn)
+{
+  size_t result = 0;
+  if (conn->inbuf) {
+    result += buf_allocation(conn->inbuf);
+    buf_clear(conn->inbuf);
+  }
+  if (conn->outbuf) {
+    result += buf_allocation(conn->outbuf);
+    buf_clear(conn->outbuf);
+  }
+  return result;
+}
+
 /** Aggressively free buffer contents on all the buffers of all streams in the
  * list starting at <b>stream</b>. Return the number of bytes recovered. */
 static size_t
@@ -1807,13 +1822,9 @@ marked_circuit_streams_free_bytes(edge_connection_t *stream)
   size_t result = 0;
   for ( ; stream; stream = stream->next_stream) {
     connection_t *conn = TO_CONN(stream);
-    if (conn->inbuf) {
-      result += buf_allocation(conn->inbuf);
-      buf_clear(conn->inbuf);
-    }
-    if (conn->outbuf) {
-      result += buf_allocation(conn->outbuf);
-      buf_clear(conn->outbuf);
+    result += marked_circuit_single_conn_free_bytes(conn);
+    if (conn->linked_conn) {
+      result += marked_circuit_single_conn_free_bytes(conn->linked_conn);
     }
   }
   return result;





More information about the tor-commits mailing list