Browse Source

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

Roger Dingledine 22 years ago
parent
commit
9ac9db782a
3 changed files with 13 additions and 15 deletions
  1. 0 3
      src/or/connection.c
  2. 12 12
      src/or/connection_or.c
  3. 1 0
      src/or/or.h

+ 0 - 3
src/or/connection.c

@@ -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)

+ 12 - 12
src/or/connection_or.c

@@ -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 */
 
 }

+ 1 - 0
src/or/or.h

@@ -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);