diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2019-07-18 14:42:20 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2019-07-18 14:42:20 +0200 |
commit | be7f405f6bf3b4532f844fe9aeb92aea9f9ca02c (patch) | |
tree | 6397bff7ee88080e49ee9857b3aa50ef97e485b1 /ext/curl | |
parent | 55d34f7023ec8a3632423c14c03a7ac6e0693143 (diff) | |
parent | 4a9f78f9d79ef999ba51a22ee03da8bdd92356f3 (diff) | |
download | php-git-be7f405f6bf3b4532f844fe9aeb92aea9f9ca02c.tar.gz |
Merge branch 'PHP-7.3' into PHP-7.4
Diffstat (limited to 'ext/curl')
-rw-r--r-- | ext/curl/interface.c | 3 | ||||
-rw-r--r-- | ext/curl/multi.c | 5 | ||||
-rw-r--r-- | ext/curl/php_curl.h | 3 | ||||
-rw-r--r-- | ext/curl/tests/bug77946.phpt | 43 |
4 files changed, 51 insertions, 3 deletions
diff --git a/ext/curl/interface.c b/ext/curl/interface.c index bc3bf0db49..6b42ddafa6 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -97,9 +97,6 @@ static ZEND_ATTRIBUTE_UNUSED unsigned long php_curl_ssl_id(void) static void _php_curl_close_ex(php_curl *ch); static void _php_curl_close(zend_resource *rsrc); -#define SAVE_CURL_ERROR(__handle, __err) \ - do { (__handle)->err.no = (int) __err; } while (0) - #define CAAL(s, v) add_assoc_long_ex(return_value, s, sizeof(s) - 1, (zend_long) v); #define CAAD(s, v) add_assoc_double_ex(return_value, s, sizeof(s) - 1, (double) v); #define CAAS(s, v) add_assoc_string_ex(return_value, s, sizeof(s) - 1, (char *) (v ? v : "")); diff --git a/ext/curl/multi.c b/ext/curl/multi.c index 8967f7822a..4ba165a09d 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -333,6 +333,7 @@ PHP_FUNCTION(curl_multi_info_read) CURLMsg *tmp_msg; int queued_msgs; zval *zmsgs_in_queue = NULL; + php_curl *ch; ZEND_PARSE_PARAMETERS_START(1, 2) Z_PARAM_RESOURCE(z_mh) @@ -370,6 +371,10 @@ PHP_FUNCTION(curl_multi_info_read) being done in add_assoc_resource */ Z_ADDREF_P(pz_ch); + /* we must save result to be able to read error message */ + ch = (php_curl*)zend_fetch_resource(Z_RES_P(pz_ch), le_curl_name, le_curl); + SAVE_CURL_ERROR(ch, tmp_msg->data.result); + /* add_assoc_resource automatically creates a new zval to wrap the "resource" represented by the current pz_ch */ diff --git a/ext/curl/php_curl.h b/ext/curl/php_curl.h index 359d6058ef..5d93f16c03 100644 --- a/ext/curl/php_curl.h +++ b/ext/curl/php_curl.h @@ -58,6 +58,9 @@ extern zend_module_entry curl_module_entry; #define PHP_CURL_RETURN 4 #define PHP_CURL_IGNORE 7 +#define SAVE_CURL_ERROR(__handle, __err) \ + do { (__handle)->err.no = (int) __err; } while (0) + extern int le_curl; #define le_curl_name "cURL handle" extern int le_curl_multi_handle; diff --git a/ext/curl/tests/bug77946.phpt b/ext/curl/tests/bug77946.phpt new file mode 100644 index 0000000000..c983a77617 --- /dev/null +++ b/ext/curl/tests/bug77946.phpt @@ -0,0 +1,43 @@ +--TEST-- +Bug #77946 (Errored cURL resources returned by curl_multi_info_read() must be compatible with curl_errno() and curl_error()) +--SKIPIF-- +<?php + +if (!extension_loaded('curl')) { + exit('skip curl extension not loaded'); +} + +?> +--FILE-- +<?php +$urls = array( + 'unknown://scheme.tld', +); + +$mh = curl_multi_init(); + +foreach ($urls as $i => $url) { + $conn[$i] = curl_init($url); + curl_multi_add_handle($mh, $conn[$i]); +} + +do { + $status = curl_multi_exec($mh, $active); + $info = curl_multi_info_read($mh); + if (false !== $info) { + var_dump($info['result']); + var_dump(curl_errno($info['handle'])); + var_dump(curl_error($info['handle'])); + } +} while ($status === CURLM_CALL_MULTI_PERFORM || $active); + +foreach ($urls as $i => $url) { + curl_close($conn[$i]); +} + +curl_multi_close($mh); +?> +--EXPECTF-- +int(1) +int(1) +string(%d) "Protocol %Sunknown%S not supported or disabled in libcurl" |