fix race condition that can cause crashes at client or exit relay

Avoid crashing if the client is trying to upload many bytes and the
circuit gets torn down at the same time, or if the flip side
happens on the exit relay. Bugfix on 0.2.0.1-alpha; fixes bug 1150.
This commit is contained in:
Roger Dingledine 2009-11-23 10:13:50 -05:00
parent 0656c12b07
commit a89f51c936
2 changed files with 5 additions and 0 deletions

View File

@ -4,6 +4,9 @@ Changes in Version 0.2.1.21 - 20??-??-??
handshake from working unless we explicitly tell OpenSSL that we are handshake from working unless we explicitly tell OpenSSL that we are
using SSL renegotiation safely. We are, of course, but OpenSSL using SSL renegotiation safely. We are, of course, but OpenSSL
0.9.8l won't work unless we say we are. 0.9.8l won't work unless we say we are.
- Avoid crashing if the client is trying to upload many bytes and the
circuit gets torn down at the same time, or if the flip side
happens on the exit relay. Bugfix on 0.2.0.1-alpha; fixes bug 1150.
o Minor bugfixes: o Minor bugfixes:
- Do not refuse to learn about authority certs and v2 networkstatus - Do not refuse to learn about authority certs and v2 networkstatus

View File

@ -1097,6 +1097,7 @@ _circuit_mark_for_close(circuit_t *circ, int reason, int line,
edge_connection_t *conn; edge_connection_t *conn;
for (conn=or_circ->n_streams; conn; conn=conn->next_stream) for (conn=or_circ->n_streams; conn; conn=conn->next_stream)
connection_edge_destroy(or_circ->p_circ_id, conn); connection_edge_destroy(or_circ->p_circ_id, conn);
or_circ->n_streams = NULL;
while (or_circ->resolving_streams) { while (or_circ->resolving_streams) {
conn = or_circ->resolving_streams; conn = or_circ->resolving_streams;
@ -1120,6 +1121,7 @@ _circuit_mark_for_close(circuit_t *circ, int reason, int line,
edge_connection_t *conn; edge_connection_t *conn;
for (conn=ocirc->p_streams; conn; conn=conn->next_stream) for (conn=ocirc->p_streams; conn; conn=conn->next_stream)
connection_edge_destroy(circ->n_circ_id, conn); connection_edge_destroy(circ->n_circ_id, conn);
ocirc->p_streams = NULL;
} }
circ->marked_for_close = line; circ->marked_for_close = line;