summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVille Hukkamaki <vhu@iki.fi>2018-08-28 23:26:13 +0200
committerJoe Watkins <krakjoe@php.net>2018-09-04 11:12:04 +0200
commit0f724453c03b7ff500563c019f5dab736d326ad8 (patch)
treeb9cb12d8b0afc1adf802a8a5307f84ed7581488f
parente58690a26d5e3800c26d24ea30d4e5a1367f096d (diff)
downloadphp-git-0f724453c03b7ff500563c019f5dab736d326ad8.tar.gz
Fix bug #74764 and add a test case
-rw-r--r--NEWS2
-rw-r--r--ext/standard/tests/network/bug74764.phpt24
-rw-r--r--main/network.c3
3 files changed, 29 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 72014486d6..ea1fd8e76c 100644
--- a/NEWS
+++ b/NEWS
@@ -12,6 +12,8 @@ PHP NEWS
- Standard:
. 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)
13 Sep 2018, PHP 7.1.22
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 8a326369a8..145911db00 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;