Просмотр исходного кода

fix assert triggers (bugs 109 and 96), and put in some
debugging logs to notice future repeat bugs.


svn:r3826

Roger Dingledine 20 лет назад
Родитель
Сommit
7373042a7b
3 измененных файлов с 22 добавлено и 2 удалено
  1. 4 2
      src/or/connection.c
  2. 7 0
      src/or/connection_edge.c
  3. 11 0
      src/or/relay.c

+ 4 - 2
src/or/connection.c

@@ -1616,8 +1616,10 @@ void assert_connection_ok(connection_t *conn, time_t now)
     tor_assert(conn->socks_request);
     if (conn->state == AP_CONN_STATE_OPEN) {
       tor_assert(conn->socks_request->has_finished);
-      tor_assert(conn->cpath_layer);
-      assert_cpath_layer_ok(conn->cpath_layer);
+      if (!conn->marked_for_close) {
+        tor_assert(conn->cpath_layer);
+        assert_cpath_layer_ok(conn->cpath_layer);
+      }
     }
   } else {
     tor_assert(!conn->socks_request);

+ 7 - 0
src/or/connection_edge.c

@@ -115,6 +115,7 @@ int connection_edge_destroy(uint16_t circ_id, connection_t *conn) {
   conn->has_sent_end = 1; /* we're closing the circuit, nothing to send to */
   connection_mark_for_close(conn);
   conn->hold_open_until_flushed = 1;
+  conn->cpath_layer = NULL;
   return 0;
 }
 
@@ -141,6 +142,12 @@ connection_edge_end(connection_t *conn, char reason, crypt_path_t *cpath_layer)
     return -1;
   }
 
+  if (conn->marked_for_close) {
+    log_fn(LOG_WARN,"Bug: called on conn that's already marked for close at %s:%d.",
+           conn->marked_for_close_file, conn->marked_for_close);
+    return 0;
+  }
+
   payload[0] = reason;
   if (reason == END_STREAM_REASON_EXITPOLICY) {
     /* this is safe even for rend circs, because they never fail

+ 11 - 0
src/or/relay.c

@@ -407,6 +407,12 @@ int connection_edge_send_command(connection_t *fromconn, circuit_t *circ,
   relay_header_t rh;
   int cell_direction;
 
+  if (fromconn->marked_for_close) {
+    log_fn(LOG_WARN,"Bug: called on conn that's already marked for close at %s:%d.",
+           fromconn->marked_for_close_file, fromconn->marked_for_close);
+    return 0;
+  }
+
   if (!circ) {
     log_fn(LOG_WARN,"no circ. Closing conn.");
     tor_assert(fromconn);
@@ -974,6 +980,11 @@ int connection_edge_package_raw_inbuf(connection_t *conn, int package_partial) {
 
   tor_assert(conn);
   tor_assert(!connection_speaks_cells(conn));
+  if (conn->marked_for_close) {
+    log_fn(LOG_WARN,"Bug: called on conn that's already marked for close at %s:%d.",
+           conn->marked_for_close_file, conn->marked_for_close);
+    return 0;
+  }
 
 repeat_connection_edge_package_raw_inbuf: