summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@gmail.com>2018-09-04 17:27:41 +0800
committerXinchen Hui <laruence@gmail.com>2018-09-04 17:27:41 +0800
commit48fd1d2ea176d05784b552faa41610ff53b6e395 (patch)
treeaf39d4c0778b707f8b01b77dbd0bffb815a2b059
parent3497b75b732723b2f8d0745336d9fcaccb2e3dd7 (diff)
parent6b5e7e6b42d88f657ab85908799a47da7af4718c (diff)
downloadphp-git-48fd1d2ea176d05784b552faa41610ff53b6e395.tar.gz
Merge branch 'PHP-7.3' of git.php.net:/php-src into PHP-7.3
* 'PHP-7.3' of git.php.net:/php-src: Fix bug #74764 and add a test case [ci skip] Update NEWS [ci skip] Update NEWS [ci skip] Update NEWS
-rw-r--r--ext/standard/tests/network/bug74764.phpt24
-rw-r--r--main/network.c3
2 files changed, 27 insertions, 0 deletions
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;