]> granicus.if.org Git - php/commitdiff
Fixed bug #48131 (Don't try to bind ipv4 addresses to ipv6 ips via bindto)
authorIlia Alshanetsky <iliaa@php.net>
Mon, 4 May 2009 13:09:15 +0000 (13:09 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Mon, 4 May 2009 13:09:15 +0000 (13:09 +0000)
main/network.c

index e5d2f595bc459d219da231c5d7047626148f5f01..4a2a6db74cc450ddf15345de00fc441efca2a9f7 100644 (file)
@@ -792,9 +792,14 @@ php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short
                switch (sa->sa_family) {
 #if HAVE_GETADDRINFO && HAVE_IPV6
                        case AF_INET6:
-                               ((struct sockaddr_in6 *)sa)->sin6_family = sa->sa_family;
-                               ((struct sockaddr_in6 *)sa)->sin6_port = htons(port);
-                               socklen = sizeof(struct sockaddr_in6);
+                               if (strstr(bindto, ':')) {
+                                       ((struct sockaddr_in6 *)sa)->sin6_family = sa->sa_family;
+                                       ((struct sockaddr_in6 *)sa)->sin6_port = htons(port);
+                                       socklen = sizeof(struct sockaddr_in6);
+                               } else {
+                                       socklen = 0;
+                                       sa = NULL;
+                               }
                                break;
 #endif
                        case AF_INET:
@@ -814,7 +819,7 @@ php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short
                        if (bindto) {
                                struct sockaddr *local_address = NULL;
                                int local_address_len = 0;
-                       
+
                                if (sa->sa_family == AF_INET) {
                                        struct sockaddr_in *in4 = emalloc(sizeof(struct sockaddr_in));