Browse Source

two more rare race conditions

svn:r143
Roger Dingledine 23 years ago
parent
commit
ac10bb6319
2 changed files with 10 additions and 6 deletions
  1. 3 1
      src/or/circuit.c
  2. 7 5
      src/or/onion.c

+ 3 - 1
src/or/circuit.c

@@ -359,9 +359,11 @@ void circuit_about_to_close_connection(connection_t *conn) {
   while((circ = circuit_get_by_conn(conn))) {
   while((circ = circuit_get_by_conn(conn))) {
     circuit_remove(circ);
     circuit_remove(circ);
     if(circ->n_conn == conn) /* it's closing in front of us */
     if(circ->n_conn == conn) /* it's closing in front of us */
+      /* circ->p_conn should always be set */
       connection_send_destroy(circ->p_aci, circ->p_conn);
       connection_send_destroy(circ->p_aci, circ->p_conn);
     if(circ->p_conn == conn) /* it's closing behind us */
     if(circ->p_conn == conn) /* it's closing behind us */
-      connection_send_destroy(circ->n_aci, circ->n_conn);
+      if(circ->n_conn)
+        connection_send_destroy(circ->n_aci, circ->n_conn);
     circuit_free(circ);
     circuit_free(circ);
   }  
   }  
 }
 }

+ 7 - 5
src/or/onion.c

@@ -87,23 +87,25 @@ int onion_pending_check(void) {
 
 
 void onion_pending_process_one(void) {
 void onion_pending_process_one(void) {
   struct data_queue_t *tmpd;
   struct data_queue_t *tmpd;
+  circuit_t *circ; 
 
 
   if(!ol_list)
   if(!ol_list)
     return; /* no onions pending, we're done */
     return; /* no onions pending, we're done */
 
 
   assert(ol_list->circ && ol_list->circ->p_conn);
   assert(ol_list->circ && ol_list->circ->p_conn);
   assert(ol_length > 0);
   assert(ol_length > 0);
+  circ = ol_list->circ;
 
 
-  if(onion_process(ol_list->circ) < 0) {
+  if(onion_process(circ) < 0) {
     log(LOG_DEBUG,"onion_pending_process_one(): Failed. Closing.");
     log(LOG_DEBUG,"onion_pending_process_one(): Failed. Closing.");
-    onion_pending_remove(ol_list->circ);
-    circuit_close(ol_list->circ);
+    onion_pending_remove(circ);
+    circuit_close(circ);
   } else {
   } else {
     log(LOG_DEBUG,"onion_pending_process_one(): Succeeded. Delivering queued data cells.");
     log(LOG_DEBUG,"onion_pending_process_one(): Succeeded. Delivering queued data cells.");
     for(tmpd = ol_list->data_cells; tmpd; tmpd=tmpd->next) {
     for(tmpd = ol_list->data_cells; tmpd; tmpd=tmpd->next) {
-      command_process_data_cell(tmpd->cell, ol_list->circ->p_conn); 
+      command_process_data_cell(tmpd->cell, circ->p_conn); 
     }
     }
-    onion_pending_remove(ol_list->circ);
+    onion_pending_remove(circ);
   }
   }
   return;
   return;
 }
 }