]> granicus.if.org Git - php/commitdiff
Improve fix bug #68421 access.format='%R' doesn't log ipv6 address
authorRemi Collet <remi@php.net>
Mon, 17 Nov 2014 05:53:38 +0000 (06:53 +0100)
committerRemi Collet <remi@php.net>
Mon, 17 Nov 2014 05:53:38 +0000 (06:53 +0100)
Log IPv4-Mapped-Ipv6 address as IPv4 (not as IPv6)

sapi/fpm/fpm/fastcgi.c

index 86fca17c5f7a319770e9e6043a4eda185378b1e6..d1db0ec293ec450823043482d3d7f2095b3ed52d 100644 (file)
@@ -1099,13 +1099,23 @@ const char *fcgi_get_last_client_ip() /* {{{ */
 {
        static char str[INET6_ADDRSTRLEN];
 
-       if (client_sa.sa.sa_family == AF_UNIX) {
-               return NULL;
-       }
+       /* Ipv4 */
        if (client_sa.sa.sa_family == AF_INET) {
                return inet_ntop(client_sa.sa.sa_family, &client_sa.sa_inet.sin_addr, str, INET6_ADDRSTRLEN);
        }
-       return inet_ntop(client_sa.sa.sa_family, &client_sa.sa_inet6.sin6_addr, str, INET6_ADDRSTRLEN);
+#ifdef IN6_IS_ADDR_V4MAPPED
+       /* Ipv4-Mapped-Ipv6 */
+       if (client_sa.sa.sa_family == AF_INET6
+               && IN6_IS_ADDR_V4MAPPED(&client_sa.sa_inet6.sin6_addr)) {
+               return inet_ntop(AF_INET, ((char *)&client_sa.sa_inet6.sin6_addr)+12, str, INET6_ADDRSTRLEN);
+       }
+#endif
+       /* Ipv6 */
+       if (client_sa.sa.sa_family == AF_INET6) {
+               return inet_ntop(client_sa.sa.sa_family, &client_sa.sa_inet6.sin6_addr, str, INET6_ADDRSTRLEN);
+       }
+       /* Unix socket */
+       return NULL;
 }
 /* }}} */
 /*