pierrick Sun, 04 Dec 2011 01:16:17 +0000
Revision: http://svn.php.net/viewvc?view=revision&revision=320340
Log:
Fix segfault when using curl_copy_handle with CURLOPT_PROGRESSFUNCTION
Changed paths:
U php/php-src/trunk/ext/curl/interface.c
A php/php-src/trunk/ext/curl/tests/curl_copy_handle_basic_008.phpt
Modified: php/php-src/trunk/ext/curl/interface.c
===================================================================
--- php/php-src/trunk/ext/curl/interface.c 2011-12-04 00:19:12 UTC (rev
320339)
+++ php/php-src/trunk/ext/curl/interface.c 2011-12-04 01:16:17 UTC (rev
320340)
@@ -1965,6 +1965,26 @@
curl_easy_setopt(dupch->cp, CURLOPT_INFILE, (void *) dupch);
curl_easy_setopt(dupch->cp, CURLOPT_WRITEHEADER, (void *) dupch);
+ if (ch->handlers->progress) {
+ dupch->handlers->progress = ecalloc(1,
sizeof(php_curl_progress));
+ if (ch->handlers->progress->func_name) {
+ zval_add_ref(&ch->handlers->progress->func_name);
+ dupch->handlers->progress->func_name =
ch->handlers->progress->func_name;
+ }
+ dupch->handlers->progress->method =
ch->handlers->progress->method;
+ curl_easy_setopt(dupch->cp, CURLOPT_PROGRESSDATA, (void *)
dupch);
+ }
+
+ if (ch->handlers->fnmatch) {
+ dupch->handlers->fnmatch = ecalloc(1, sizeof(php_curl_fnmatch));
+ if (ch->handlers->fnmatch->func_name) {
+ zval_add_ref(&ch->handlers->fnmatch->func_name);
+ dupch->handlers->fnmatch->func_name =
ch->handlers->fnmatch->func_name;
+ }
+ dupch->handlers->fnmatch->method =
ch->handlers->fnmatch->method;
+ curl_easy_setopt(dupch->cp, CURLOPT_FNMATCH_DATA, (void *)
dupch);
+ }
+
efree(dupch->to_free);
dupch->to_free = ch->to_free;
Added: php/php-src/trunk/ext/curl/tests/curl_copy_handle_basic_008.phpt
===================================================================
--- php/php-src/trunk/ext/curl/tests/curl_copy_handle_basic_008.phpt
(rev 0)
+++ php/php-src/trunk/ext/curl/tests/curl_copy_handle_basic_008.phpt
2011-12-04 01:16:17 UTC (rev 320340)
@@ -0,0 +1,25 @@
+--TEST--
+Test curl_copy_handle() with CURLOPT_PROGRESSFUNCTION
+--SKIPIF--
+<?php if (!extension_loaded("curl") || false ===
getenv('PHP_CURL_HTTP_REMOTE_SERVER')) print "skip need
PHP_CURL_HTTP_REMOTE_SERVER environment variable"; ?>
+--FILE--
+<?php
+ $host = getenv('PHP_CURL_HTTP_REMOTE_SERVER');
+
+ $url = "{$host}/get.php";
+ $ch = curl_init($url);
+
+ curl_setopt($ch, CURLOPT_NOPROGRESS, 0);
+ curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
+ curl_setopt($ch, CURLOPT_PROGRESSFUNCTION, function() { });
+ $ch2 = curl_copy_handle($ch);
+ echo curl_exec($ch), PHP_EOL;
+ unset($ch);
+ echo curl_exec($ch2);
+
+?>
+--EXPECTF--
+Hello World!
+Hello World!
+Hello World!
+Hello World!
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php