|  | @@ -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);
 |