diff --git a/ext-src/swoole_runtime.cc b/ext-src/swoole_runtime.cc index 2fd2bc335af..15d27bab036 100644 --- a/ext-src/swoole_runtime.cc +++ b/ext-src/swoole_runtime.cc @@ -1409,6 +1409,7 @@ bool PHPCoroutine::enable_hook(uint32_t flags) { SW_HOOK_NATIVE_FUNC_WITH_ARG_INFO(curl_multi_exec); SW_HOOK_NATIVE_FUNC_WITH_ARG_INFO(curl_multi_select); SW_HOOK_NATIVE_FUNC_WITH_ARG_INFO(curl_multi_getcontent); + SW_HOOK_NATIVE_FUNC_WITH_ARG_INFO(curl_multi_info_read); SW_HOOK_NATIVE_FUNC_WITH_ARG_INFO(curl_multi_remove_handle); SW_HOOK_NATIVE_FUNC_WITH_ARG_INFO(curl_multi_close); } @@ -1431,6 +1432,9 @@ bool PHPCoroutine::enable_hook(uint32_t flags) { SW_UNHOOK_FUNC(curl_multi_init); SW_UNHOOK_FUNC(curl_multi_add_handle); SW_UNHOOK_FUNC(curl_multi_exec); + SW_UNHOOK_FUNC(curl_multi_select); + SW_UNHOOK_FUNC(curl_multi_getcontent); + SW_UNHOOK_FUNC(curl_multi_info_read); SW_UNHOOK_FUNC(curl_multi_remove_handle); SW_UNHOOK_FUNC(curl_multi_close); } diff --git a/tests/swoole_runtime/curl_native/multi.phpt b/tests/swoole_runtime/curl_native/multi.phpt index 84cd138808d..8568dc4bc9e 100644 --- a/tests/swoole_runtime/curl_native/multi.phpt +++ b/tests/swoole_runtime/curl_native/multi.phpt @@ -46,6 +46,14 @@ run(function () { } } + $info1 = curl_multi_info_read($mh); + $info2 = curl_multi_info_read($mh); + $info3 = curl_multi_info_read($mh); + + Assert::eq($info1['msg'], CURLMSG_DONE); + Assert::eq($info2['msg'], CURLMSG_DONE); + Assert::eq($info3, false); + Assert::contains(curl_multi_getcontent($ch1), 'baidu.com'); Assert::contains(curl_multi_getcontent($ch2), '中央人民政府门户网站'); diff --git a/thirdparty/php/curl/interface.cc b/thirdparty/php/curl/interface.cc index 3b6b29f6019..5f16fd37b3a 100644 --- a/thirdparty/php/curl/interface.cc +++ b/thirdparty/php/curl/interface.cc @@ -118,7 +118,7 @@ php_curl *_php_curl_get_handle(zval *zid, bool exclusive) { ch = Z_CURL_P(zid); #else if ((ch = (php_curl *) zend_fetch_resource(Z_RES_P(zid), le_curl_name, le_curl)) == NULL) { - swFatalError(SW_ERROR_INVALID_PARAMS, "cURL is executing, cannot be operated"); + swFatalError(SW_ERROR_INVALID_PARAMS, "supplied resource is not a valid " le_curl_name "Handle resource "); return nullptr; } #endif diff --git a/thirdparty/php/curl/multi.cc b/thirdparty/php/curl/multi.cc index 82907417d3c..7f736278494 100644 --- a/thirdparty/php/curl/multi.cc +++ b/thirdparty/php/curl/multi.cc @@ -46,7 +46,12 @@ static inline php_curlm *curl_multi_from_obj(zend_object *obj) { extern int _php_curl_get_le_curl(); extern int _php_curl_get_le_curl_multi(); static inline php_curlm *Z_CURL_MULTI_P(zval *zv) { - return (php_curlm *) zend_fetch_resource(Z_RES_P(zv), le_curl_multi_handle_name, _php_curl_get_le_curl_multi()); + php_curlm *cm; + if ((cm = (php_curlm *) zend_fetch_resource(Z_RES_P(zv), le_curl_multi_handle_name, _php_curl_get_le_curl_multi())) == NULL) { + swFatalError(SW_ERROR_INVALID_PARAMS, "supplied resource is not a valid " le_curl_multi_handle_name "Handle resource "); + return nullptr; + } + return cm; } #endif