diff options
-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 |