| 
					
				 | 
			
			
				@@ -543,6 +543,45 @@ connection_is_reading(connection_t *conn) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     (conn->read_event && event_pending(conn->read_event, EV_READ, NULL)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** Check whether <b>conn</b> is correct in having (or not having) a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * read/write event (passed in <b>ev</b). On success, return 0. On failure, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * log a warning and return -1. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+connection_check_event(connection_t *conn, struct event *ev) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  int bad; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (conn->type == CONN_TYPE_AP && TO_EDGE_CONN(conn)->is_dns_request) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* DNS requests which we launch through the dnsserv.c module do not have 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * any underlying socket or any underlying linked connection, so they 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * shouldn't have any attached events either. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    bad = ev != NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* Everytyhing else should have an underlying socket, or a linked 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * connection (which is also tracked with a read_event/write_event pair). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    bad = ev == NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (bad) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    log_warn(LD_BUG, "Event missing on connection %p [%s;%s]. " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             "socket=%d. linked=%d. " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             "is_dns_request=%d. Marked_for_close=%s:%d", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             conn, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             conn_type_to_string(conn->type), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             conn_state_to_string(conn->type, conn->state), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             (int)conn->s, (int)conn->linked, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             (conn->type == CONN_TYPE_AP && TO_EDGE_CONN(conn)->is_dns_request), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             conn->marked_for_close_file ? conn->marked_for_close_file : "-", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             conn->marked_for_close 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+             ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    log_backtrace(LOG_WARN, LD_BUG, "Backtrace attached."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** Tell the main loop to stop notifying <b>conn</b> of any read events. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 MOCK_IMPL(void, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 connection_stop_reading,(connection_t *conn)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -554,7 +593,9 @@ connection_stop_reading,(connection_t *conn)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_assert(conn->read_event); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (connection_check_event(conn, conn->read_event) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (conn->linked) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     conn->reading_from_linked_conn = 0; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -579,7 +620,9 @@ connection_start_reading,(connection_t *conn)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_assert(conn->read_event); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (connection_check_event(conn, conn->read_event) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (conn->linked) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     conn->reading_from_linked_conn = 1; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -619,7 +662,9 @@ connection_stop_writing,(connection_t *conn)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_assert(conn->write_event); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (connection_check_event(conn, conn->write_event) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (conn->linked) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     conn->writing_to_linked_conn = 0; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -645,7 +690,9 @@ connection_start_writing,(connection_t *conn)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   }); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  tor_assert(conn->write_event); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (connection_check_event(conn, conn->write_event) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (conn->linked) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     conn->writing_to_linked_conn = 1; 
			 |