@@ -90,63 +90,66 @@ class REQUEST_STORED_CONTEXT : public IHttpStoredContext
9090
9191char  *GetIpAddr (apr_pool_t  *pool, PSOCKADDR pAddr)
9292{
93- 	const  char  *format = " %15[0-9.]:%5[0-9]"  ;
94- 	char  ip[16 ] = { 0  };  //  ip4 addresses have max len 15
95- 	char  port[6 ] = { 0  }; //  port numbers are 16bit, ie 5 digits max
96- 
97- 	DWORD len = 50 ;
98- 	char  *buf = (char  *)apr_palloc (pool, len);
99- 
100- 	if (buf == NULL )
93+ 	if  (pAddr == NULL ) {
10194		return  " "  ;
102- 
103- 	buf[0 ] = 0 ;
104- 
105- 	WSAAddressToString (pAddr, sizeof (SOCKADDR), NULL , buf, &len);
106- 
107- 	//  test for IPV4 with port on the end
108- 	if  (sscanf (buf, format, ip, port) == 2 ) {
109- 		//  IPV4 but with port - remove the port
110- 		char * input = " :"  ;
111- 		char * ipv4 = strtok (buf, input);
112- 		return  ipv4;
11395	}
114- 
96+ 	
97+ 	DWORD addrSize = pAddr->sa_family  == AF_INET ? sizeof (SOCKADDR_IN) : sizeof (SOCKADDR_IN6);
98+ 	char * buf = (char *)apr_palloc (pool, NI_MAXHOST);
99+ 	if  (buf == NULL ) {
100+ 		return  " "  ;
101+ 	}
102+ 	buf[0 ] = ' \0 '  ;
103+ 	
104+ 	if  (GetNameInfo (pAddr, addrSize, buf, NI_MAXHOST, NULL , 0 , NI_NUMERICHOST) != 0 ) {
105+ 		return  " "  ;
106+ 	}
107+ 	
115108	return  buf;
116109}
117110
118111apr_sockaddr_t  *CopySockAddr (apr_pool_t  *pool, PSOCKADDR pAddr)
119112{
120-     apr_sockaddr_t  *addr = (apr_sockaddr_t  *)apr_palloc (pool, sizeof (apr_sockaddr_t ));
121- 	int  adrlen = 16 , iplen = 4 ;
113+ 	apr_sockaddr_t  *addr = (apr_sockaddr_t  *)apr_palloc (pool, sizeof (apr_sockaddr_t ));
122114
123- 	if (pAddr->sa_family  == AF_INET6)
124- 	{
125- 		adrlen = 46 ;
126- 		iplen = 16 ;
115+ 	addr->pool  = pool;
116+ 	addr->hostname  = " unknown"  ;
117+ 	addr->servname  = addr->hostname ;
118+ 	addr->family  = AF_UNSPEC;
119+ 	addr->addr_str_len  = 0 ;
120+ 	addr->ipaddr_len  = 0 ;
121+ 	addr->ipaddr_ptr  = NULL ;
122+ 	addr->salen  = 0 ;
123+ 	addr->port  = 0 ;
124+ 
125+ 	if  (pAddr == NULL ) {
126+ 		return  addr;
127127	}
128128
129- 	addr->addr_str_len  = adrlen;
130129	addr->family  = pAddr->sa_family ;
131130
132- 	addr->hostname  = " unknown"  ;
133- #ifdef  WIN32
134-     addr->ipaddr_len  = sizeof (IN_ADDR);
135- #else 
136-     addr->ipaddr_len  = sizeof (struct  in_addr );
137- #endif 
138-     addr->ipaddr_ptr  = &addr->sa .sin .sin_addr ;
139-     addr->pool  = pool;
140-     addr->port  = 80 ;
141- #ifdef  WIN32
142- 	memcpy (&addr->sa .sin .sin_addr .S_un .S_addr , pAddr->sa_data , iplen);
143- #else 
144-     memcpy (&addr->sa .sin .sin_addr .s_addr , pAddr->sa_data , iplen);
145- #endif 
146- 	addr->sa .sin .sin_family  = pAddr->sa_family ;
147-     addr->sa .sin .sin_port  = 80 ;
148-     addr->salen  = sizeof (addr->sa );
149- 	addr->servname  = addr->hostname ;
131+ 	if  (pAddr->sa_family  == AF_INET) {
132+ 		SOCKADDR_IN *sin = (SOCKADDR_IN *)pAddr;
133+ 		addr->addr_str_len  = INET_ADDRSTRLEN;
134+ 		addr->ipaddr_len  = sizeof (struct  in_addr );
135+ 		addr->ipaddr_ptr  = &addr->sa .sin .sin_addr ;
136+ 		addr->sa .sin .sin_family  = AF_INET;
137+ 		addr->sa .sin .sin_port  = sin->sin_port ; /*  keep network byte order */ 
138+ 		/*  copy address */ 
139+ 		memcpy (&addr->sa .sin .sin_addr , &sin->sin_addr , sizeof (struct  in_addr ));
140+ 		addr->salen  = sizeof (addr->sa );
141+ 		addr->port  = ntohs (sin->sin_port );
142+ 	} else  if  (pAddr->sa_family  == AF_INET6) {
143+ 		SOCKADDR_IN6 *sin6 = (SOCKADDR_IN6 *)pAddr;
144+ 		addr->addr_str_len  = INET6_ADDRSTRLEN;
145+ 		addr->ipaddr_len  = sizeof (struct  in6_addr );
146+ 		addr->ipaddr_ptr  = &addr->sa .sin6 .sin6_addr ;
147+ 		addr->sa .sin6 .sin6_family  = AF_INET6;
148+ 		addr->sa .sin6 .sin6_port  = sin6->sin6_port ;
149+ 		memcpy (&addr->sa .sin6 .sin6_addr , &sin6->sin6_addr , sizeof (struct  in6_addr ));
150+ 		addr->salen  = sizeof (addr->sa );
151+ 		addr->port  = ntohs (sin6->sin6_port );
152+ 	}
150153
151154	return  addr;
152155}
0 commit comments