From 4024c69c7997a2d7b5b898680ed21d78ce39e1af Mon Sep 17 00:00:00 2001 From: Ville Hukkamaki Date: Tue, 28 Aug 2018 23:26:13 +0200 Subject: [PATCH] Fix bug #74764 and add a test case --- ext/standard/tests/network/bug74764.phpt | 24 ++++++++++++++++++++++++ main/network.c | 3 +++ 2 files changed, 27 insertions(+) create mode 100644 ext/standard/tests/network/bug74764.phpt diff --git a/ext/standard/tests/network/bug74764.phpt b/ext/standard/tests/network/bug74764.phpt new file mode 100644 index 0000000000000..e946167008ad8 --- /dev/null +++ b/ext/standard/tests/network/bug74764.phpt @@ -0,0 +1,24 @@ +--TEST-- +Bug #74764 IPv6 bindto fails with stream_socket_client() +--SKIPIF-- + +--FILE-- + 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 8a326369a8753..145911db007e9 100644 --- a/main/network.c +++ b/main/network.c @@ -863,6 +863,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;