]> git.ipfire.org Git - thirdparty/tor.git/commitdiff
fix rare race condition
authorRoger Dingledine <arma@torproject.org>
Mon, 24 Mar 2003 02:50:07 +0000 (02:50 +0000)
committerRoger Dingledine <arma@torproject.org>
Mon, 24 Mar 2003 02:50:07 +0000 (02:50 +0000)
if the directory is remade while an OR is handshaking, the directory
needs to become dirty again when the handshake succeeds

svn:r215

src/or/connection.c
src/or/connection_or.c
src/or/or.h

index 41d07293fedf9babe5d77ebb26d2918f46cc3c8c..3cae0d42d8df82050f154bf65e3a330a1e976cea 100644 (file)
@@ -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)
index 7443f042fa3c0ce6d0ddaa827d4b949d097f9ed1..ed3bd8be9d9000a75495ef7eaa4db296780c2ba3 100644 (file)
@@ -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 */
 
 }
index 4871ee3b781bb94ecfc0f03810eadb59fec3d01a..73ac995ad0776c8409ccbf9a4bea106b56327d15 100644 (file)
@@ -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);