zend_bool in_callback;
uint32_t* clone;
zval postfields;
+ /* CurlShareHandle object set using CURLOPT_SHARE. */
+ struct _php_curlsh *share;
zend_object std;
} php_curl;
zend_object std;
} php_curlm;
-typedef struct {
+typedef struct _php_curlsh {
CURLSH *share;
struct {
int no;
if (Z_TYPE_P(zvalue) == IS_OBJECT && Z_OBJCE_P(zvalue) == curl_share_ce) {
php_curlsh *sh = Z_CURL_SHARE_P(zvalue);
curl_easy_setopt(ch->cp, CURLOPT_SHARE, sh->share);
+
+ if (ch->share) {
+ OBJ_RELEASE(&ch->share->std);
+ }
+ GC_ADDREF(&sh->std);
+ ch->share = sh;
}
}
break;
efree(ch->handlers);
zval_ptr_dtor(&ch->postfields);
+ if (ch->share) {
+ OBJ_RELEASE(&ch->share->std);
+ }
+
zend_object_std_dtor(&ch->std);
}
/* }}} */
--- /dev/null
+--TEST--
+Basic curl_share test
+--FILE--
+<?php
+
+$sh = curl_share_init();
+
+$ch1 = curl_init();
+curl_setopt($ch1, CURLOPT_URL, 'file://' . __DIR__ . '/curl_testdata1.txt');
+curl_setopt($ch1, CURLOPT_RETURNTRANSFER, true);
+curl_setopt($ch1, CURLOPT_SHARE, $sh);
+
+$ch2 = curl_init();
+curl_setopt($ch2, CURLOPT_URL, 'file://' . __DIR__ . '/curl_testdata2.txt');
+curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true);
+curl_setopt($ch2, CURLOPT_SHARE, $sh);
+
+// Make sure nothing bad handles if the share handle is unset early.
+unset($sh);
+
+var_dump(curl_exec($ch1));
+var_dump(curl_exec($ch2));
+
+?>
+--EXPECT--
+string(6) "CURL1
+"
+string(6) "CURL2
+"