mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-20 10:12:15 +01:00
fix rare race condition
if the directory is remade while an OR is handshaking, the directory needs to become dirty again when the handshake succeeds svn:r215
This commit is contained in:
parent
9d03ae627d
commit
9ac9db782a
@ -123,9 +123,6 @@ connection_t *connection_new(int type) {
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
if(type == CONN_TYPE_OR) {
|
||||
directory_set_dirty();
|
||||
}
|
||||
#ifdef USE_ZLIB
|
||||
if (type == CONN_TYPE_AP || type == CONN_TYPE_EXIT) {
|
||||
if (buf_new(&conn->z_outbuf, &conn->z_outbuflen, &conn->z_outbuf_datalen) < 0)
|
||||
|
@ -86,9 +86,8 @@ int connection_or_finished_flushing(connection_t *conn) {
|
||||
case OR_CONN_STATE_CLIENT_SENDING_NONCE:
|
||||
log(LOG_DEBUG,"connection_or_finished_flushing(): client finished sending nonce.");
|
||||
conn_or_init_crypto(conn);
|
||||
conn->state = OR_CONN_STATE_OPEN;
|
||||
connection_init_timeval(conn);
|
||||
connection_watch_events(conn, POLLIN);
|
||||
connection_or_set_open(conn);
|
||||
|
||||
return connection_process_inbuf(conn); /* in case there's anything waiting on it */
|
||||
case OR_CONN_STATE_SERVER_SENDING_AUTH:
|
||||
log(LOG_DEBUG,"connection_or_finished_flushing(): server finished sending auth.");
|
||||
@ -110,6 +109,13 @@ int connection_or_finished_flushing(connection_t *conn) {
|
||||
|
||||
/*********************/
|
||||
|
||||
void connection_or_set_open(connection_t *conn) {
|
||||
conn->state = OR_CONN_STATE_OPEN;
|
||||
directory_set_dirty();
|
||||
connection_init_timeval(conn);
|
||||
connection_watch_events(conn, POLLIN);
|
||||
}
|
||||
|
||||
void conn_or_init_crypto(connection_t *conn) {
|
||||
//int x;
|
||||
unsigned char iv[16];
|
||||
@ -327,9 +333,7 @@ int or_handshake_op_finished_sending_keys(connection_t *conn) {
|
||||
/* do crypto initialization, etc */
|
||||
conn_or_init_crypto(conn);
|
||||
|
||||
conn->state = OR_CONN_STATE_OPEN;
|
||||
connection_init_timeval(conn);
|
||||
connection_watch_events(conn, POLLIN); /* give it a default, tho the ap_handshake call may change it */
|
||||
connection_or_set_open(conn);
|
||||
ap_handshake_n_conn_open(conn); /* send the pending onions */
|
||||
return 0;
|
||||
}
|
||||
@ -532,9 +536,7 @@ int or_handshake_client_process_auth(connection_t *conn) {
|
||||
/* it finished sending */
|
||||
log(LOG_DEBUG,"or_handshake_client_process_auth(): Finished sending nonce.");
|
||||
conn_or_init_crypto(conn);
|
||||
conn->state = OR_CONN_STATE_OPEN;
|
||||
connection_init_timeval(conn);
|
||||
connection_watch_events(conn, POLLIN);
|
||||
connection_or_set_open(conn);
|
||||
return connection_process_inbuf(conn); /* process the rest of the inbuf */
|
||||
|
||||
}
|
||||
@ -719,9 +721,7 @@ int or_handshake_server_process_nonce(connection_t *conn) {
|
||||
log(LOG_DEBUG,"or_handshake_server_process_nonce() : Response valid. Authentication complete.");
|
||||
|
||||
conn_or_init_crypto(conn);
|
||||
conn->state = OR_CONN_STATE_OPEN;
|
||||
connection_init_timeval(conn);
|
||||
connection_watch_events(conn, POLLIN);
|
||||
connection_or_set_open(conn);
|
||||
return connection_process_inbuf(conn); /* process the rest of the inbuf */
|
||||
|
||||
}
|
||||
|
@ -649,6 +649,7 @@ int connection_op_handle_listener_read(connection_t *conn);
|
||||
int connection_or_process_inbuf(connection_t *conn);
|
||||
int connection_or_finished_flushing(connection_t *conn);
|
||||
|
||||
void connection_or_set_open(connection_t *conn);
|
||||
void conn_or_init_crypto(connection_t *conn);
|
||||
|
||||
int or_handshake_op_send_keys(connection_t *conn);
|
||||
|
Loading…
Reference in New Issue
Block a user