summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2020-09-09 14:28:55 +0200
committerChristoph M. Becker <cmbecker69@gmx.de>2020-09-11 14:44:12 +0200
commitdfb3a799140d7d526c0ab77be437b663bfac9cc4 (patch)
tree3bee0a92c25aeb24576968abf0cc4455ebeef440
parent2d4aa1ef3d04ec85a15ae426ffdaa4f2fb0f1556 (diff)
downloadphp-git-dfb3a799140d7d526c0ab77be437b663bfac9cc4.tar.gz
Fix #80067: Omitting the port in bindto setting errors
A recent commit[1] which fixed a memory leak introduced a regression regarding the formerly liberal handling of IP addresses to bind to. We fix this by reverting that commit, and fix the memory leak where it actually occurs. In other words, this fix is less intrusive than the former fix. [1] <http://git.php.net/?p=php-src.git;a=commit;h=0b8c83f5936581942715d14883cdebddc18bad30> Closes GH-6104.
-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