diff --git a/ext/curl/interface.c b/ext/curl/interface.c index 677eaa8703af0..a009521b6b1b9 100644 --- a/ext/curl/interface.c +++ b/ext/curl/interface.c @@ -1310,6 +1310,7 @@ void _php_setup_easy_copy_handlers(php_curl *ch, php_curl *source) #endif ZVAL_COPY(&ch->private_data, &source->private_data); + ZVAL_COPY(&ch->postfields, &source->postfields); efree(ch->to_free); ch->to_free = source->to_free; @@ -1595,7 +1596,7 @@ PHP_FUNCTION(curl_copy_handle) _php_setup_easy_copy_handlers(dupch, ch); - postfields = &ch->postfields; + postfields = &dupch->postfields; if (Z_TYPE_P(postfields) != IS_UNDEF) { if (build_mime_structure_from_hash(dupch, postfields) == FAILURE) { zval_ptr_dtor(return_value); diff --git a/ext/curl/tests/curl_handle_clone2.phpt b/ext/curl/tests/curl_handle_clone2.phpt new file mode 100644 index 0000000000000..c605230671e23 --- /dev/null +++ b/ext/curl/tests/curl_handle_clone2.phpt @@ -0,0 +1,46 @@ +--TEST-- +Test that cloning of Curl object post CURLFile multiple times with curl_multi_exec() +--EXTENSIONS-- +curl +--FILE-- + $file); +var_dump(curl_setopt($ch1, CURLOPT_POSTFIELDS, $params)); + +$ch2 = clone $ch1; +$ch3 = clone $ch1; + +$mh = curl_multi_init(); +curl_multi_add_handle($mh, $ch1); +curl_multi_add_handle($mh, $ch2); +do { + $status = curl_multi_exec($mh, $active); + if ($active) { + curl_multi_select($mh); + } +} while ($active && $status == CURLM_OK); + +curl_multi_remove_handle($mh, $ch1); +curl_multi_remove_handle($mh, $ch2); +curl_multi_remove_handle($mh, $ch3); +curl_multi_close($mh); +?> +===DONE=== +--EXPECT-- +bool(true) +curl_copy_handle_variation4.txt|application/octet-stream|5curl_copy_handle_variation4.txt|application/octet-stream|5===DONE=== +--CLEAN-- +