mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-12-06 19:41:15 +01:00
fix many bugs in package_window handling
svn:r363
This commit is contained in:
+2
-1
@@ -405,9 +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(circuit_consider_stop_edge_reading(circ, edge_type, layer_hint))
|
||||
return;
|
||||
}
|
||||
}
|
||||
circuit_consider_stop_edge_reading(circ, edge_type, layer_hint);
|
||||
}
|
||||
|
||||
/* returns 1 if the window is empty, else 0. If it's empty, tell edge conns to stop reading. */
|
||||
|
||||
+12
-13
@@ -550,12 +550,20 @@ int connection_package_raw_inbuf(connection_t *conn) {
|
||||
|
||||
assert(conn);
|
||||
assert(!connection_speaks_cells(conn));
|
||||
/* this function should never get called if either package_window is 0 */
|
||||
|
||||
|
||||
repeat_connection_package_raw_inbuf:
|
||||
|
||||
circ = circuit_get_by_conn(conn);
|
||||
if(!circ) {
|
||||
log_fn(LOG_DEBUG,"conn has no circuits!");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(circuit_consider_stop_edge_reading(circ, conn->type, conn->cpath_layer))
|
||||
return 0;
|
||||
|
||||
amount_to_process = conn->inbuf_datalen;
|
||||
|
||||
|
||||
if(!amount_to_process)
|
||||
return 0;
|
||||
|
||||
@@ -570,12 +578,6 @@ repeat_connection_package_raw_inbuf:
|
||||
|
||||
connection_fetch_from_buf(cell.payload+RELAY_HEADER_SIZE, cell.length, conn);
|
||||
|
||||
circ = circuit_get_by_conn(conn);
|
||||
if(!circ) {
|
||||
log_fn(LOG_DEBUG,"conn has no circuits!");
|
||||
return -1;
|
||||
}
|
||||
|
||||
log_fn(LOG_DEBUG,"(%d) Packaging %d bytes (%d waiting).",conn->s,cell.length, conn->inbuf_datalen);
|
||||
|
||||
|
||||
@@ -605,14 +607,11 @@ repeat_connection_package_raw_inbuf:
|
||||
conn->cpath_layer->package_window--;
|
||||
}
|
||||
|
||||
if(circuit_consider_stop_edge_reading(circ,
|
||||
conn->type == CONN_TYPE_EXIT ? EDGE_EXIT : EDGE_AP, conn->cpath_layer))
|
||||
return 0;
|
||||
|
||||
assert(conn->package_window > 0);
|
||||
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 %d",conn->package_window);
|
||||
|
||||
@@ -50,7 +50,6 @@ int connection_edge_process_inbuf(connection_t *conn) {
|
||||
case EXIT_CONN_STATE_OPEN:
|
||||
if(connection_package_raw_inbuf(conn) < 0)
|
||||
return -1;
|
||||
circuit_consider_stop_edge_reading(circuit_get_by_conn(conn), conn->type == CONN_TYPE_AP ? EDGE_AP : EDGE_EXIT, conn->cpath_layer);
|
||||
return 0;
|
||||
case EXIT_CONN_STATE_CONNECTING:
|
||||
log_fn(LOG_DEBUG,"text from server while in 'connecting' state at exit. Leaving it on buffer.");
|
||||
@@ -247,9 +246,9 @@ int connection_edge_process_relay_cell(cell_t *cell, circuit_t *circ, connection
|
||||
return 0;
|
||||
}
|
||||
conn->package_window += STREAMWINDOW_INCREMENT;
|
||||
log_fn(LOG_DEBUG,"stream-level sendme, packagewindow now %d.", conn->package_window);
|
||||
connection_start_reading(conn);
|
||||
if(!circuit_consider_stop_edge_reading(circ, edge_type, layer_hint))
|
||||
connection_package_raw_inbuf(conn); /* handle whatever might still be on the inbuf */
|
||||
connection_package_raw_inbuf(conn); /* handle whatever might still be on the inbuf */
|
||||
break;
|
||||
default:
|
||||
log_fn(LOG_DEBUG,"unknown relay command %d.",relay_command);
|
||||
|
||||
@@ -205,7 +205,7 @@ int connection_or_create_listener(struct sockaddr_in *bindaddr) {
|
||||
}
|
||||
|
||||
int connection_or_handle_listener_read(connection_t *conn) {
|
||||
log(LOG_NOTICE,"OR: Received a connection request from a router. Attempting to authenticate.");
|
||||
log(LOG_NOTICE,"OR: Received a connection request. Attempting to authenticate.");
|
||||
return connection_handle_listener_read(conn, CONN_TYPE_OR, OR_CONN_STATE_SERVER_AUTH_WAIT);
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user