summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--NEWS1
-rw-r--r--ext/standard/tests/network/bindto.phpt4
-rw-r--r--ext/standard/tests/network/bug80067.phpt13
-rw-r--r--main/network.c12
-rw-r--r--main/streams/xp_socket.c4
5 files changed, 29 insertions, 5 deletions
diff --git a/NEWS b/NEWS
index a037e2f28a..67fbb361b7 100644
--- a/NEWS
+++ b/NEWS
@@ -30,6 +30,7 @@ PHP NEWS
. Fixed bug #80077 (getmxrr test bug). (Rainer Jung)
. Fixed bug #72941 (Modifying bucket->data by-ref has no effect any longer).
(cmb)
+ . Fixed bug #80067 (Omitting the port in bindto setting errors). (cmb)
03 Sep 2020, PHP 7.3.22
diff --git a/ext/standard/tests/network/bindto.phpt b/ext/standard/tests/network/bindto.phpt
index 32f8a0cb81..27ae45e5ff 100644
--- a/ext/standard/tests/network/bindto.phpt
+++ b/ext/standard/tests/network/bindto.phpt
@@ -13,4 +13,6 @@ $fp = stream_socket_client(
);
?>
--EXPECTF--
-Warning: stream_socket_client(): unable to connect to tcp://%s:80 (Failed to parse address "invalid") in %s on line %d
+Warning: stream_socket_client(): php_network_getaddresses: getaddrinfo failed: %s in %s on line %d
+
+Warning: stream_socket_client(): unable to connect to tcp://www.xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx.com:80 (php_network_getaddresses: getaddrinfo failed: %s) in %s on line %d
diff --git a/ext/standard/tests/network/bug80067.phpt b/ext/standard/tests/network/bug80067.phpt
new file mode 100644
index 0000000000..19b2c76bb9
--- /dev/null
+++ b/ext/standard/tests/network/bug80067.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Bug #80067 (Omitting the port in bindto setting errors)
+--SKIPIF--
+<?php
+if (getenv("SKIP_ONLINE_TESTS")) die('skip online test');
+?>
+--FILE--
+<?php
+$context = stream_context_create(['socket' => ['bindto' => '0']]);
+var_dump(file_get_contents('https://httpbin.org/get', false, $context) !== false);
+?>
+--EXPECT--
+bool(true)
diff --git a/main/network.c b/main/network.c
index 3c8e81cc81..8035adb195 100644
--- a/main/network.c
+++ b/main/network.c
@@ -200,6 +200,10 @@ PHPAPI int php_network_getaddresses(const char *host, int socktype, struct socka
if ((n = getaddrinfo(host, NULL, &hints, &res))) {
if (error_string) {
+ /* free error string received during previous iteration (if any) */
+ if (*error_string) {
+ zend_string_release_ex(*error_string, 0);
+ }
*error_string = strpprintf(0, "php_network_getaddresses: getaddrinfo failed: %s", PHP_GAI_STRERROR(n));
php_error_docref(NULL, E_WARNING, "%s", ZSTR_VAL(*error_string));
} else {
@@ -208,6 +212,10 @@ PHPAPI int php_network_getaddresses(const char *host, int socktype, struct socka
return 0;
} else if (res == NULL) {
if (error_string) {
+ /* free error string received during previous iteration (if any) */
+ if (*error_string) {
+ zend_string_release_ex(*error_string, 0);
+ }
*error_string = strpprintf(0, "php_network_getaddresses: getaddrinfo failed (null result pointer) errno=%d", errno);
php_error_docref(NULL, E_WARNING, "%s", ZSTR_VAL(*error_string));
} else {
@@ -241,6 +249,10 @@ PHPAPI int php_network_getaddresses(const char *host, int socktype, struct socka
}
if (host_info == NULL) {
if (error_string) {
+ /* free error string received during previous iteration (if any) */
+ if (*error_string) {
+ zend_string_release_ex(*error_string, 0);
+ }
*error_string = strpprintf(0, "php_network_getaddresses: gethostbyname failed. errno=%d", errno);
php_error_docref(NULL, E_WARNING, "%s", ZSTR_VAL(*error_string));
} else {
diff --git a/main/streams/xp_socket.c b/main/streams/xp_socket.c
index 4bca670b84..0ae0c0f77b 100644
--- a/main/streams/xp_socket.c
+++ b/main/streams/xp_socket.c
@@ -744,10 +744,6 @@ static inline int php_tcp_sockop_connect(php_stream *stream, php_netstream_data_
return -1;
}
bindto = parse_ip_address_ex(Z_STRVAL_P(tmpzval), Z_STRLEN_P(tmpzval), &bindport, xparam->want_errortext, &xparam->outputs.error_text);
- if (bindto == NULL) {
- efree(host);
- return -1;
- }
}
#ifdef SO_BROADCAST