diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2020-09-09 14:28:55 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2020-09-11 14:44:12 +0200 |
commit | dfb3a799140d7d526c0ab77be437b663bfac9cc4 (patch) | |
tree | 3bee0a92c25aeb24576968abf0cc4455ebeef440 | |
parent | 2d4aa1ef3d04ec85a15ae426ffdaa4f2fb0f1556 (diff) | |
download | php-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-- | NEWS | 1 | ||||
-rw-r--r-- | ext/standard/tests/network/bindto.phpt | 4 | ||||
-rw-r--r-- | ext/standard/tests/network/bug80067.phpt | 13 | ||||
-rw-r--r-- | main/network.c | 12 | ||||
-rw-r--r-- | main/streams/xp_socket.c | 4 |
5 files changed, 29 insertions, 5 deletions
@@ -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 |