From 3bb218a0a776f8673ea8fab1fb311b760afc0860 Mon Sep 17 00:00:00 2001 From: Pierrick Charron Date: Mon, 17 Sep 2018 20:28:44 -0400 Subject: Fix 76480: Use curl_multi_wait() so that timeouts are respected --- ext/curl/multi.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'ext/curl') diff --git a/ext/curl/multi.c b/ext/curl/multi.c index dd1c436bdd..7a41b22ea2 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -190,6 +190,7 @@ PHP_FUNCTION(curl_multi_remove_handle) } /* }}} */ +#if LIBCURL_VERSION_NUM < 0x071c00 static void _make_timeval_struct(struct timeval *to, double timeout) /* {{{ */ { unsigned long conv; @@ -199,6 +200,7 @@ static void _make_timeval_struct(struct timeval *to, double timeout) /* {{{ */ to->tv_usec = conv % 1000000; } /* }}} */ +#endif /* {{{ proto int curl_multi_select(resource mh[, double timeout]) Get all the sockets associated with the cURL extension, which can then be "selected" */ @@ -206,12 +208,16 @@ PHP_FUNCTION(curl_multi_select) { zval *z_mh; php_curlm *mh; + double timeout = 1.0; +#if LIBCURL_VERSION_NUM >= 0x071c00 /* Available since 7.28.0 */ + int numfds = 0; +#else fd_set readfds; fd_set writefds; fd_set exceptfds; int maxfd; - double timeout = 1.0; struct timeval to; +#endif CURLMcode error = CURLM_OK; if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|d", &z_mh, &timeout) == FAILURE) { @@ -222,6 +228,15 @@ PHP_FUNCTION(curl_multi_select) RETURN_FALSE; } +#if LIBCURL_VERSION_NUM >= 0x071c00 /* Available since 7.28.0 */ + error = curl_multi_wait(mh->multi, NULL, 0, (unsigned long) timeout * 1000.0, &numfds); + if (CURLM_OK != error) { + SAVE_CURLM_ERROR(mh, error); + RETURN_LONG(-1); + } + + RETURN_LONG(numfds); +#else _make_timeval_struct(&to, timeout); FD_ZERO(&readfds); @@ -235,6 +250,7 @@ PHP_FUNCTION(curl_multi_select) RETURN_LONG(-1); } RETURN_LONG(select(maxfd + 1, &readfds, &writefds, &exceptfds, &to)); +#endif } /* }}} */ -- cgit v1.2.1