| 
					
				 | 
			
			
				@@ -16,7 +16,8 @@ const char connection_c_id[] = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #include "or.h" 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static connection_t *connection_create_listener( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                               struct sockaddr *listensockaddr, int type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                               struct sockaddr *listensockaddr, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                               socklen_t listensocklen, int type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                char* address); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static void connection_init(time_t now, connection_t *conn, int type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                             int socket_family); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -850,10 +851,9 @@ warn_too_many_conns(void) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * to the conn. 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static connection_t * 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-connection_create_listener(struct sockaddr *listensockaddr, int type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                           char* address) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+connection_create_listener(struct sockaddr *listensockaddr, socklen_t socklen, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                           int type, char* address) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  /*XXXX021 this function should take a socklen too. */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   connection_t *conn; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int s; /* the socket we're going to make */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   uint16_t usePort = 0; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -895,7 +895,7 @@ connection_create_listener(struct sockaddr *listensockaddr, int type, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                (socklen_t)sizeof(one)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    if (bind(s,listensockaddr,(socklen_t)sizeof(struct sockaddr_in)) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (bind(s,listensockaddr,socklen) < 0) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       const char *helpfulhint = ""; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       int e = tor_socket_errno(s); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       if (ERRNO_IS_EADDRINUSE(e)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1424,6 +1424,7 @@ retry_listeners(int type, config_line_t *cfg, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         char *address = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         struct sockaddr *listensockaddr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        socklen_t listensocklen; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         switch (socket_family) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           case AF_INET: 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -1431,18 +1432,21 @@ retry_listeners(int type, config_line_t *cfg, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                              create_inet_sockaddr(cfg_line->value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                   (uint16_t) port_option, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                   &address); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            listensocklen = sizeof(struct sockaddr_in); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           case AF_UNIX: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             listensockaddr = (struct sockaddr *) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                              create_unix_sockaddr(cfg_line->value, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                                   &address); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            listensocklen = sizeof(struct sockaddr_un); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             break; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           default: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				             tor_assert(0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         if (listensockaddr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          conn = connection_create_listener(listensockaddr, type, address); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          conn = connection_create_listener(listensockaddr, listensocklen, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                            type, address); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           tor_free(listensockaddr); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				           tor_free(address); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         } else 
			 |