| 
					
				 | 
			
			
				@@ -284,6 +284,27 @@ dirserv_free_descriptors() 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   smartlist_clear(descriptor_list); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/** Return -1 if <b>ri</b> has a private or otherwise bad address, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ * unless we're configured to not care. Return 0 if all ok. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static int 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+dirserv_router_has_valid_address(routerinfo_t *ri) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  struct in_addr iaddr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (get_options()->DirAllowPrivateAddresses) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return 0; /* whatever it is, we're fine with it */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (!tor_inet_aton(ri->address, &iaddr)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    log_fn(LOG_INFO,"Router '%s' published non-IP address '%s'. Refusing.", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           ri->nickname, ri->address); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return -1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (is_internal_IP(ntohl(iaddr.s_addr))) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    log_fn(LOG_INFO,"Router '%s' published internal IP address '%s'. Refusing.", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+           ri->nickname, ri->address); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return -1; /* it's a private IP, we should reject it */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /** Parse the server descriptor at *desc and maybe insert it into the 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * list of server descriptors, and (if the descriptor is well-formed) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * advance *desc immediately past the descriptor's end. 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -340,7 +361,7 @@ dirserv_add_descriptor(const char **desc) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (r==0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     char fp[FINGERPRINT_LEN+1]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    log_fn(LOG_INFO, "Unknown nickname '%s' (%s:%d). Adding.", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    log_fn(LOG_INFO, "Unknown nickname '%s' (%s:%d). Will try to add.", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				            ri->nickname, ri->address, ri->or_port); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (crypto_pk_get_fingerprint(ri->identity_pkey, fp, 1) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       log_fn(LOG_WARN, "Error computing fingerprint for '%s'", ri->nickname); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -363,6 +384,12 @@ dirserv_add_descriptor(const char **desc) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     *desc = end; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (dirserv_router_has_valid_address(ri) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    log_fn(LOG_NOTICE, "Router with nickname '%s' has invalid address '%s'. Not adding.", ri->nickname, ri->address); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    routerinfo_free(ri); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    *desc = end; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* Do we already have an entry for this router? */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   for (i = 0; i < smartlist_len(descriptor_list); ++i) { 
			 |