summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorXinchen Hui <laruence@php.net>2014-05-09 14:00:47 +0800
committerXinchen Hui <laruence@php.net>2014-05-09 14:00:47 +0800
commit2d9bc88db8caebd44d81cbdfbcb109cf3bdfbca8 (patch)
treee2fe9745820112924229325ebab09dd8c2522aa6
parent564db38dc48e3b8c5a7f39decda3e92ea68ff894 (diff)
downloadphp-git-2d9bc88db8caebd44d81cbdfbcb109cf3bdfbca8.tar.gz
Fixed clone refcount
-rw-r--r--ext/curl/interface.c10
-rw-r--r--ext/curl/php_curl.h2
2 files changed, 7 insertions, 5 deletions
diff --git a/ext/curl/interface.c b/ext/curl/interface.c
index ad4367e444..7c1cd3036b 100644
--- a/ext/curl/interface.c
+++ b/ext/curl/interface.c
@@ -1980,7 +1980,7 @@ PHP_FUNCTION(curl_copy_handle)
dupch->to_free = ch->to_free;
/* Keep track of cloned copies to avoid invoking curl destructors for every clone */
- ZVAL_COPY(&dupch->clone, &ch->clone);
+ ch->clone++;
ZEND_REGISTER_RESOURCE(return_value, dupch, le_curl);
dupch->res = Z_RES_P(return_value);
@@ -2583,8 +2583,10 @@ static int _php_curl_setopt(php_curl *ch, long option, zval *zvalue TSRMLS_DC) /
return FAILURE;
}
- if (Z_REFCOUNTED(ch->clone) && Z_REFCOUNT(ch->clone) <= 1) {
+ if (ch->clone == 0) {
zend_llist_clean(&ch->to_free->post);
+ } else {
+ --ch->clone;
}
zend_llist_add_element(&ch->to_free->post, &first);
error = curl_easy_setopt(ch->cp, CURLOPT_HTTPPOST, first);
@@ -3167,14 +3169,14 @@ static void _php_curl_close_ex(php_curl *ch TSRMLS_DC)
curl_easy_cleanup(ch->cp);
/* cURL destructors should be invoked only by last curl handle */
- if (Z_ISUNDEF(ch->clone)) {
+ if (ch->clone == 0) {
zend_llist_clean(&ch->to_free->str);
zend_llist_clean(&ch->to_free->post);
zend_hash_destroy(ch->to_free->slist);
efree(ch->to_free->slist);
efree(ch->to_free);
} else {
- //??? Z_DELREF(ch->clone);
+ --ch->clone;
}
smart_str_free(&ch->handlers->write->buf);
diff --git a/ext/curl/php_curl.h b/ext/curl/php_curl.h
index 018add502b..3994ca9dc1 100644
--- a/ext/curl/php_curl.h
+++ b/ext/curl/php_curl.h
@@ -180,7 +180,7 @@ typedef struct {
php_curl_handlers *handlers;
zend_resource *res;
zend_bool in_callback;
- zval clone;
+ zend_uint clone;
zend_bool safe_upload;
} php_curl;