mirror of
https://gitlab.torproject.org/tpo/core/tor.git
synced 2024-11-10 13:13:44 +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;
|
return NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(type == CONN_TYPE_OR) {
|
|
||||||
directory_set_dirty();
|
|
||||||
}
|
|
||||||
#ifdef USE_ZLIB
|
#ifdef USE_ZLIB
|
||||||
if (type == CONN_TYPE_AP || type == CONN_TYPE_EXIT) {
|
if (type == CONN_TYPE_AP || type == CONN_TYPE_EXIT) {
|
||||||
if (buf_new(&conn->z_outbuf, &conn->z_outbuflen, &conn->z_outbuf_datalen) < 0)
|
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:
|
case OR_CONN_STATE_CLIENT_SENDING_NONCE:
|
||||||
log(LOG_DEBUG,"connection_or_finished_flushing(): client finished sending nonce.");
|
log(LOG_DEBUG,"connection_or_finished_flushing(): client finished sending nonce.");
|
||||||
conn_or_init_crypto(conn);
|
conn_or_init_crypto(conn);
|
||||||
conn->state = OR_CONN_STATE_OPEN;
|
connection_or_set_open(conn);
|
||||||
connection_init_timeval(conn);
|
|
||||||
connection_watch_events(conn, POLLIN);
|
|
||||||
return connection_process_inbuf(conn); /* in case there's anything waiting on it */
|
return connection_process_inbuf(conn); /* in case there's anything waiting on it */
|
||||||
case OR_CONN_STATE_SERVER_SENDING_AUTH:
|
case OR_CONN_STATE_SERVER_SENDING_AUTH:
|
||||||
log(LOG_DEBUG,"connection_or_finished_flushing(): server finished 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) {
|
void conn_or_init_crypto(connection_t *conn) {
|
||||||
//int x;
|
//int x;
|
||||||
unsigned char iv[16];
|
unsigned char iv[16];
|
||||||
@ -327,9 +333,7 @@ int or_handshake_op_finished_sending_keys(connection_t *conn) {
|
|||||||
/* do crypto initialization, etc */
|
/* do crypto initialization, etc */
|
||||||
conn_or_init_crypto(conn);
|
conn_or_init_crypto(conn);
|
||||||
|
|
||||||
conn->state = OR_CONN_STATE_OPEN;
|
connection_or_set_open(conn);
|
||||||
connection_init_timeval(conn);
|
|
||||||
connection_watch_events(conn, POLLIN); /* give it a default, tho the ap_handshake call may change it */
|
|
||||||
ap_handshake_n_conn_open(conn); /* send the pending onions */
|
ap_handshake_n_conn_open(conn); /* send the pending onions */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
@ -532,9 +536,7 @@ int or_handshake_client_process_auth(connection_t *conn) {
|
|||||||
/* it finished sending */
|
/* it finished sending */
|
||||||
log(LOG_DEBUG,"or_handshake_client_process_auth(): Finished sending nonce.");
|
log(LOG_DEBUG,"or_handshake_client_process_auth(): Finished sending nonce.");
|
||||||
conn_or_init_crypto(conn);
|
conn_or_init_crypto(conn);
|
||||||
conn->state = OR_CONN_STATE_OPEN;
|
connection_or_set_open(conn);
|
||||||
connection_init_timeval(conn);
|
|
||||||
connection_watch_events(conn, POLLIN);
|
|
||||||
return connection_process_inbuf(conn); /* process the rest of the inbuf */
|
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.");
|
log(LOG_DEBUG,"or_handshake_server_process_nonce() : Response valid. Authentication complete.");
|
||||||
|
|
||||||
conn_or_init_crypto(conn);
|
conn_or_init_crypto(conn);
|
||||||
conn->state = OR_CONN_STATE_OPEN;
|
connection_or_set_open(conn);
|
||||||
connection_init_timeval(conn);
|
|
||||||
connection_watch_events(conn, POLLIN);
|
|
||||||
return connection_process_inbuf(conn); /* process the rest of the inbuf */
|
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_process_inbuf(connection_t *conn);
|
||||||
int connection_or_finished_flushing(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);
|
void conn_or_init_crypto(connection_t *conn);
|
||||||
|
|
||||||
int or_handshake_op_send_keys(connection_t *conn);
|
int or_handshake_op_send_keys(connection_t *conn);
|
||||||
|
Loading…
Reference in New Issue
Block a user