mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-30 15:43:32 +01:00
two more rare race conditions
svn:r143
This commit is contained in:
parent
8f18647a33
commit
ac10bb6319
@ -359,9 +359,11 @@ void circuit_about_to_close_connection(connection_t *conn) {
|
|||||||
while((circ = circuit_get_by_conn(conn))) {
|
while((circ = circuit_get_by_conn(conn))) {
|
||||||
circuit_remove(circ);
|
circuit_remove(circ);
|
||||||
if(circ->n_conn == conn) /* it's closing in front of us */
|
if(circ->n_conn == conn) /* it's closing in front of us */
|
||||||
|
/* circ->p_conn should always be set */
|
||||||
connection_send_destroy(circ->p_aci, circ->p_conn);
|
connection_send_destroy(circ->p_aci, circ->p_conn);
|
||||||
if(circ->p_conn == conn) /* it's closing behind us */
|
if(circ->p_conn == conn) /* it's closing behind us */
|
||||||
connection_send_destroy(circ->n_aci, circ->n_conn);
|
if(circ->n_conn)
|
||||||
|
connection_send_destroy(circ->n_aci, circ->n_conn);
|
||||||
circuit_free(circ);
|
circuit_free(circ);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -87,23 +87,25 @@ int onion_pending_check(void) {
|
|||||||
|
|
||||||
void onion_pending_process_one(void) {
|
void onion_pending_process_one(void) {
|
||||||
struct data_queue_t *tmpd;
|
struct data_queue_t *tmpd;
|
||||||
|
circuit_t *circ;
|
||||||
|
|
||||||
if(!ol_list)
|
if(!ol_list)
|
||||||
return; /* no onions pending, we're done */
|
return; /* no onions pending, we're done */
|
||||||
|
|
||||||
assert(ol_list->circ && ol_list->circ->p_conn);
|
assert(ol_list->circ && ol_list->circ->p_conn);
|
||||||
assert(ol_length > 0);
|
assert(ol_length > 0);
|
||||||
|
circ = ol_list->circ;
|
||||||
|
|
||||||
if(onion_process(ol_list->circ) < 0) {
|
if(onion_process(circ) < 0) {
|
||||||
log(LOG_DEBUG,"onion_pending_process_one(): Failed. Closing.");
|
log(LOG_DEBUG,"onion_pending_process_one(): Failed. Closing.");
|
||||||
onion_pending_remove(ol_list->circ);
|
onion_pending_remove(circ);
|
||||||
circuit_close(ol_list->circ);
|
circuit_close(circ);
|
||||||
} else {
|
} else {
|
||||||
log(LOG_DEBUG,"onion_pending_process_one(): Succeeded. Delivering queued data cells.");
|
log(LOG_DEBUG,"onion_pending_process_one(): Succeeded. Delivering queued data cells.");
|
||||||
for(tmpd = ol_list->data_cells; tmpd; tmpd=tmpd->next) {
|
for(tmpd = ol_list->data_cells; tmpd; tmpd=tmpd->next) {
|
||||||
command_process_data_cell(tmpd->cell, ol_list->circ->p_conn);
|
command_process_data_cell(tmpd->cell, circ->p_conn);
|
||||||
}
|
}
|
||||||
onion_pending_remove(ol_list->circ);
|
onion_pending_remove(circ);
|
||||||
}
|
}
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user