| 
					
				 | 
			
			
				@@ -181,6 +181,31 @@ rend_add_service(rend_service_t *service) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     log_warn(LD_CONFIG, "Hidden service with no ports configured; ignoring."); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     rend_service_free(service); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    int dupe = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    /* XXX This duplicate check has two problems: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * a) It's O(n^2), but the same comment from the bottom of 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     *    rend_config_services() should apply. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * b) We only compare directory paths as strings, so we can't 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     *    detect two distinct paths that specify the same directory 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     *    (which can arise from symlinks, case-insensitivity, bind 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     *    mounts, etc.). 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * It also can't detect that two separate Tor instances are trying 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * to use the same HiddenServiceDir; for that, we would need a 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * lock file.  But this is enough to detect a simple mistake that 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     * at least one person has actually made. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    SMARTLIST_FOREACH(rend_service_list, rend_service_t*, ptr, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                      dupe = dupe || 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                             !strcmp(ptr->directory, service->directory)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (dupe) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      log_warn(LD_REND, "Another hidden service is already configured for " 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+               "directory %s, ignoring.", service->directory); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      rend_service_free(service); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      return; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     smartlist_add(rend_service_list, service); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     log_debug(LD_REND,"Configuring service with directory \"%s\"", 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				               service->directory); 
			 |