diff options
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | ext/standard/tests/network/bug74764.phpt | 24 | ||||
-rw-r--r-- | main/network.c | 3 |
3 files changed, 29 insertions, 0 deletions
@@ -24,6 +24,8 @@ PHP NEWS . Fixed bug #76818 (Memory corruption and segfault). (Remi) . Fixed bug #73457 (Wrong error message when fopen FTP wrapped fails to open data connection). (Ville Hukkamäki) + . Fixed bug #74764 (Bindto IPv6 works with file_get_contents but fails with + stream_socket_client). (Ville Hukkamäki) 30 Aug 2018, PHP 7.3.0beta3 diff --git a/ext/standard/tests/network/bug74764.phpt b/ext/standard/tests/network/bug74764.phpt new file mode 100644 index 0000000000..e946167008 --- /dev/null +++ b/ext/standard/tests/network/bug74764.phpt @@ -0,0 +1,24 @@ +--TEST-- +Bug #74764 IPv6 bindto fails with stream_socket_client() +--SKIPIF-- +<?php +/* following copied straight from the tcp6loop.phpt */ +@stream_socket_client('tcp://[::1]:0', $errno); +if ($errno != 111) die('skip IPv6 not supported.'); +?> +--FILE-- +<?php +$context = stream_context_create( + ['socket' => array('bindto' => "[::]:0")] + ); + $socket = stream_socket_client('tcp://localhost:1443', $errno, $errstr, 5, STREAM_CLIENT_CONNECT, $context); + +$context = stream_context_create( + array('socket' => array('bindto' => "0.0.0.0:0")) + ); + $socket = stream_socket_client('tcp://localhost:1443', $errno, $errstr, 5, STREAM_CLIENT_CONNECT, $context); +?> +--EXPECTF-- +Warning: stream_socket_client(): unable to connect to tcp://localhost:1443 (%s) in %s on line %d + +Warning: stream_socket_client(): unable to connect to tcp://localhost:1443 (%s) in %s on line %d diff --git a/main/network.c b/main/network.c index 6a1ef981c1..7eccb36047 100644 --- a/main/network.c +++ b/main/network.c @@ -839,6 +839,9 @@ php_socket_t php_network_connect_socket_to_host(const char *host, unsigned short int local_address_len = 0; if (sa->sa_family == AF_INET) { + if (strchr(bindto,':')) { + goto skip_bind; + } struct sockaddr_in *in4 = emalloc(sizeof(struct sockaddr_in)); local_address = (struct sockaddr*)in4; |