|  | @@ -853,6 +853,43 @@ warn_too_many_conns(void)
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +#ifdef HAVE_SYS_UN_H
 | 
	
		
			
				|  |  | +/** Check whether we should be willing to open an AF_UNIX socket in
 | 
	
		
			
				|  |  | + * <b>path</b>.  Return 0 if we should go ahead and -1 if we shouldn't. */
 | 
	
		
			
				|  |  | +static int
 | 
	
		
			
				|  |  | +check_location_for_unix_socket(or_options_t *options, const char *path)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +  int r = -1;
 | 
	
		
			
				|  |  | +  char *p = tor_strdup(path);
 | 
	
		
			
				|  |  | +  cpd_check_t flags = CPD_CHECK_MODE_ONLY;
 | 
	
		
			
				|  |  | +  if (get_parent_directory(p)<0)
 | 
	
		
			
				|  |  | +    goto done;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (options->ControlSocketsGroupWritable)
 | 
	
		
			
				|  |  | +    flags |= CPD_GROUP_OK;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (check_private_dir(p, flags) < 0) {
 | 
	
		
			
				|  |  | +    char *escpath, *escdir;
 | 
	
		
			
				|  |  | +    escpath = esc_for_log(path);
 | 
	
		
			
				|  |  | +    escdir = esc_for_log(p);
 | 
	
		
			
				|  |  | +    log_warn(LD_GENERAL, "Before Tor can create a control socket in %s, the "
 | 
	
		
			
				|  |  | +             "directory %s needs to exist, and to be accessible only by the "
 | 
	
		
			
				|  |  | +             "user%s account that is running Tor.  (On some Unix systems, "
 | 
	
		
			
				|  |  | +             "anybody who can list a socket can conect to it, so Tor is "
 | 
	
		
			
				|  |  | +             "being careful.)", escpath, escdir,
 | 
	
		
			
				|  |  | +             options->ControlSocketsGroupWritable ? " and group" : "");
 | 
	
		
			
				|  |  | +    tor_free(escpath);
 | 
	
		
			
				|  |  | +    tor_free(escdir);
 | 
	
		
			
				|  |  | +    goto done;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  r = 0;
 | 
	
		
			
				|  |  | + done:
 | 
	
		
			
				|  |  | +  tor_free(p);
 | 
	
		
			
				|  |  | +  return r;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +#endif
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  /** Bind a new non-blocking socket listening to the socket described
 | 
	
		
			
				|  |  |   * by <b>listensockaddr</b>.
 | 
	
		
			
				|  |  |   *
 | 
	
	
		
			
				|  | @@ -947,6 +984,9 @@ connection_create_listener(const struct sockaddr *listensockaddr,
 | 
	
		
			
				|  |  |       * and listeners at the same time */
 | 
	
		
			
				|  |  |      tor_assert(type == CONN_TYPE_CONTROL_LISTENER);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +    if (check_location_for_unix_socket(get_options(), address) < 0)
 | 
	
		
			
				|  |  | +      goto err;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |      log_notice(LD_NET, "Opening %s on %s",
 | 
	
		
			
				|  |  |                 conn_type_to_string(type), address);
 | 
	
		
			
				|  |  |  
 |