coverity fixes
[m6w6/ext-http] / src / php_http_client_curl.c
index be04be89296d47728cc8aa63571d7675eca35c63..cca6a27cd869422bed12e8c9a81058650b94153c 100644 (file)
@@ -177,22 +177,19 @@ static int php_http_curle_progress_callback(void *ctx, double dltotal, double dl
 #endif
 {
        php_http_client_curl_handler_t *h = ctx;
-       zend_bool update = 0;
 
        if (h->progress.dl.total != dltotal
        ||      h->progress.dl.now != dlnow
        ||      h->progress.ul.total != ultotal
        ||      h->progress.ul.now != ulnow
        ) {
-               update = 1;
-
                h->progress.dl.total = dltotal;
                h->progress.dl.now = dlnow;
                h->progress.ul.total = ultotal;
                h->progress.ul.now = ulnow;
        }
 
-       if (update && h->client->callback.progress.func) {
+       if (h->client->callback.progress.func) {
                h->client->callback.progress.func(h->client->callback.progress.arg, h->client, &h->queue, &h->progress);
        }
 
@@ -477,6 +474,12 @@ static ZEND_RESULT_CODE php_http_curle_get_info(CURL *ch, HashTable *info)
                zend_hash_str_update(info, "local_port", lenof("local_port"), &tmp);
        }
 #endif
+#if PHP_HTTP_CURL_VERSION(7,50,0)
+       if (CURLE_OK == curl_easy_getinfo(ch, CURLINFO_HTTP_VERSION, &l)) {
+               ZVAL_LONG(&tmp, l);
+               zend_hash_str_update(info, "http_version", lenof("http_version"), &tmp);
+       }
+#endif
 
        /* END::CURLINFO */
 
@@ -1630,7 +1633,7 @@ static ZEND_RESULT_CODE php_http_curlm_option_set_use_eventloop(php_http_option_
        php_http_client_t *client = userdata;
        php_http_client_curl_ops_t *ev_ops = NULL;
 
-       if (Z_TYPE_P(value) == IS_OBJECT && instanceof_function(Z_OBJCE_P(value), php_http_client_curl_user_get_class_entry())) {
+       if (value && Z_TYPE_P(value) == IS_OBJECT && instanceof_function(Z_OBJCE_P(value), php_http_client_curl_user_get_class_entry())) {
                ev_ops = php_http_client_curl_user_ops_get();
 #if PHP_HTTP_HAVE_EVENT
        } else if (value && zend_is_true(value)) {
@@ -2195,6 +2198,11 @@ static ZEND_RESULT_CODE php_http_client_curl_dequeue(php_http_client_t *h, php_h
        php_http_client_curl_t *curl = h->ctx;
        php_http_client_curl_handler_t *handler = enqueue->opaque;
 
+       if (h->callback.depth) {
+               php_error_docref(NULL, E_WARNING, "Could not dequeue request while executing callbacks");
+               return FAILURE;
+       }
+
        php_http_client_curl_handler_clear(handler);
        if (CURLM_OK == (rs = curl_multi_remove_handle(curl->handle->multi, handler->handle))) {
                zend_llist_del_element(&h->requests, handler->handle, (int (*)(void *, void *)) compare_queue);
@@ -2258,35 +2266,38 @@ static int php_http_client_curl_once(php_http_client_t *h)
 {
        php_http_client_curl_t *curl = h->ctx;
 
-       if (curl->ev_ops) {
-               curl->ev_ops->once(curl->ev_ctx);
-       } else {
-               while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(curl->handle->multi, &curl->unfinished));
-       }
+       if (!h->callback.depth) {
+               if (curl->ev_ops) {
+                       curl->ev_ops->once(curl->ev_ctx);
+               } else {
+                       while (CURLM_CALL_MULTI_PERFORM == curl_multi_perform(curl->handle->multi, &curl->unfinished));
+               }
 
-       php_http_client_curl_responsehandler(h);
+               php_http_client_curl_responsehandler(h);
+       }
 
        return curl->unfinished;
-
 }
 
 static ZEND_RESULT_CODE php_http_client_curl_exec(php_http_client_t *h)
 {
        php_http_client_curl_t *curl = h->ctx;
 
-       if (curl->ev_ops) {
-               return curl->ev_ops->exec(curl->ev_ctx);
-       }
+       if (!h->callback.depth) {
+               if (curl->ev_ops) {
+                       return curl->ev_ops->exec(curl->ev_ctx);
+               }
 
-       while (php_http_client_curl_once(h) && !EG(exception)) {
-               if (SUCCESS != php_http_client_curl_wait(h, NULL)) {
+               while (php_http_client_curl_once(h) && !EG(exception)) {
+                       if (SUCCESS != php_http_client_curl_wait(h, NULL)) {
 #ifdef PHP_WIN32
-                       /* see http://msdn.microsoft.com/library/en-us/winsock/winsock/windows_sockets_error_codes_2.asp */
-                       php_error_docref(NULL, E_WARNING, "WinSock error: %d", WSAGetLastError());
+                               /* see http://msdn.microsoft.com/library/en-us/winsock/winsock/windows_sockets_error_codes_2.asp */
+                               php_error_docref(NULL, E_WARNING, "WinSock error: %d", WSAGetLastError());
 #else
-                       php_error_docref(NULL, E_WARNING, "%s", strerror(errno));
+                               php_error_docref(NULL, E_WARNING, "%s", strerror(errno));
 #endif
-                       return FAILURE;
+                               return FAILURE;
+                       }
                }
        }