| 
					
				 | 
			
			
				@@ -788,6 +788,8 @@ static time_t last_expired_clientside_circuits = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * As a diagnostic for bug 8387, log information about how many one-hop 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * circuits we have around that have been there for at least <b>age</b> 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * seconds. Log a few of them. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * Ignores Single Onion Service intro and Tor2web redezvous circuits, they are 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * expected to be long-term one-hop circuits. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 circuit_log_ancient_one_hop_circuits(int age) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -797,6 +799,7 @@ circuit_log_ancient_one_hop_circuits(int age) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   time_t cutoff = now - age; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int n_found = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   smartlist_t *log_these = smartlist_new(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  const or_options_t *options = get_options(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   SMARTLIST_FOREACH_BEGIN(circuit_get_global_list(), circuit_t *, circ) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     const origin_circuit_t *ocirc; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -804,6 +807,19 @@ circuit_log_ancient_one_hop_circuits(int age) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (circ->timestamp_created.tv_sec >= cutoff) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* Single Onion Services deliberately make long term one-hop intro 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * connections. We only ignore active intro point connections, if we take 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * a long time establishing, that's worth logging. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (rend_service_allow_non_anonymous_connection(options) && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        circ->purpose == CIRCUIT_PURPOSE_S_INTRO) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* Tor2web deliberately makes long term one-hop rend connections, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * particularly when Tor2webRendezvousPoints is used. We only ignore 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * active rend point connections, if we take a long time to rendezvous, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * that's worth logging. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (rend_client_allow_non_anonymous_connection(options) && 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        circ->purpose == CIRCUIT_PURPOSE_C_REND_JOINED) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      continue; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     ocirc = CONST_TO_ORIGIN_CIRCUIT(circ); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (ocirc->build_state && ocirc->build_state->onehop_tunnel) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -839,7 +855,7 @@ circuit_log_ancient_one_hop_circuits(int age) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       tor_asprintf(&dirty, "Dirty since %s (%ld seconds vs %ld-second cutoff)", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                    dirty_since, (long)(now - circ->timestamp_dirty), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                   (long) get_options()->MaxCircuitDirtiness); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                   (long) options->MaxCircuitDirtiness); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       dirty = tor_strdup("Not marked dirty"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 |