Sfoglia il codice sorgente

Attempt to track down bug in conn->package_window

svn:r415
Nick Mathewson 22 anni fa
parent
commit
14c8bc598b
2 ha cambiato i file con 11 aggiunte e 7 eliminazioni
  1. 4 0
      src/or/circuit.c
  2. 7 7
      src/or/connection.c

+ 4 - 0
src/or/circuit.c

@@ -405,6 +405,10 @@ void circuit_resume_edge_reading(circuit_t *circ, int edge_type, crypt_path_t *l
        (edge_type == EDGE_AP   && conn->package_window > 0 && conn->cpath_layer == layer_hint)) {
       connection_start_reading(conn);
       connection_package_raw_inbuf(conn); /* handle whatever might still be on the inbuf */
+
+      /* If the circuit won't accept any more data, return without looking
+       * at any more of the streams. Any connections that should be stopped
+       * have already been stopped by connection_package_raw_inbuf. */
       if(circuit_consider_stop_edge_reading(circ, edge_type, layer_hint))
         return;
     }

+ 7 - 7
src/or/connection.c

@@ -564,6 +564,7 @@ int connection_package_raw_inbuf(connection_t *conn) {
   assert(!connection_speaks_cells(conn));
 
 repeat_connection_package_raw_inbuf:
+  assert(conn->package_window > 0);
 
   circ = circuit_get_by_conn(conn);
   if(!circ) {
@@ -620,13 +621,12 @@ repeat_connection_package_raw_inbuf:
   }
 
   assert(conn->package_window > 0);
-  conn->package_window--;
-//  if(--conn->package_window <= 0) { /* is it 0 after decrement? */
-//    connection_stop_reading(conn);
-//    log_fn(LOG_DEBUG,"conn->package_window reached 0.");
-//    circuit_consider_stop_edge_reading(circ, conn->type, conn->cpath_layer);
-//    return 0; /* don't process the inbuf any more */
-//  }
+  if(--conn->package_window <= 0) { /* is it 0 after decrement? */
+    connection_stop_reading(conn);
+    log_fn(LOG_DEBUG,"conn->package_window reached 0.");
+    circuit_consider_stop_edge_reading(circ, conn->type, conn->cpath_layer);
+    return 0; /* don't process the inbuf any more */
+  }
   log_fn(LOG_DEBUG,"conn->package_window is now %d",conn->package_window);
 
   /* handle more if there's more, or return 0 if there isn't */