pierrick Sun, 04 Dec 2011 01:34:54 +0000 Revision: http://svn.php.net/viewvc?view=revision&revision=320341
Log: Fixed bug #60439curl_copy_handle segfault when used with CURLOPT_PROGRESSFUNCTION Bug: https://bugs.php.net/60439 (Open) curl_copy_handle segfault when used with CURLOPT_PROGRESSFUNCTION Changed paths: U php/php-src/branches/PHP_5_3/NEWS U php/php-src/branches/PHP_5_3/ext/curl/interface.c A php/php-src/branches/PHP_5_3/ext/curl/tests/curl_copy_handle_basic_008.phpt U php/php-src/branches/PHP_5_4/NEWS U php/php-src/branches/PHP_5_4/ext/curl/interface.c A php/php-src/branches/PHP_5_4/ext/curl/tests/curl_copy_handle_basic_008.phpt Modified: php/php-src/branches/PHP_5_3/NEWS =================================================================== --- php/php-src/branches/PHP_5_3/NEWS 2011-12-04 01:16:17 UTC (rev 320340) +++ php/php-src/branches/PHP_5_3/NEWS 2011-12-04 01:34:54 UTC (rev 320341) @@ -26,6 +26,10 @@ - BCmath: . Fixed bug #60377 (bcscale related crashes on 64bits platforms). (shm) +- cURL: + . Fixed bug #60439 (curl_copy_handle segfault when used with + CURLOPT_PROGRESSFUNCTION). (Pierrick) + - Date: . Fixed bug #60373 (Startup errors with log_errors on cause segfault). (Derick) Modified: php/php-src/branches/PHP_5_3/ext/curl/interface.c =================================================================== --- php/php-src/branches/PHP_5_3/ext/curl/interface.c 2011-12-04 01:16:17 UTC (rev 320340) +++ php/php-src/branches/PHP_5_3/ext/curl/interface.c 2011-12-04 01:34:54 UTC (rev 320341) @@ -1649,11 +1649,18 @@ zval_add_ref(&ch->handlers->write_header->func_name); dupch->handlers->write_header->func_name = ch->handlers->write_header->func_name; } + + 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_ERRORBUFFER, dupch->err.str); curl_easy_setopt(dupch->cp, CURLOPT_FILE, (void *) dupch); curl_easy_setopt(dupch->cp, CURLOPT_INFILE, (void *) dupch); curl_easy_setopt(dupch->cp, CURLOPT_WRITEHEADER, (void *) dupch); + curl_easy_setopt(dupch->cp, CURLOPT_PROGRESSDATA, (void *) dupch); efree(dupch->to_free); dupch->to_free = ch->to_free; Added: php/php-src/branches/PHP_5_3/ext/curl/tests/curl_copy_handle_basic_008.phpt =================================================================== --- php/php-src/branches/PHP_5_3/ext/curl/tests/curl_copy_handle_basic_008.phpt (rev 0) +++ php/php-src/branches/PHP_5_3/ext/curl/tests/curl_copy_handle_basic_008.phpt 2011-12-04 01:34:54 UTC (rev 320341) @@ -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! Modified: php/php-src/branches/PHP_5_4/NEWS =================================================================== --- php/php-src/branches/PHP_5_4/NEWS 2011-12-04 01:16:17 UTC (rev 320340) +++ php/php-src/branches/PHP_5_4/NEWS 2011-12-04 01:34:54 UTC (rev 320341) @@ -10,6 +10,10 @@ - CLI SAPI: . Implement FR #60390 (Missing $_SERVER['SERVER_PORT']). (Pierre) +- cURL: + . Fixed bug #60439 (curl_copy_handle segfault when used with + CURLOPT_PROGRESSFUNCTION). (Pierrick) + - Intl: . Added support for UTS #46. (Gustavo) Modified: php/php-src/branches/PHP_5_4/ext/curl/interface.c =================================================================== --- php/php-src/branches/PHP_5_4/ext/curl/interface.c 2011-12-04 01:16:17 UTC (rev 320340) +++ php/php-src/branches/PHP_5_4/ext/curl/interface.c 2011-12-04 01:34:54 UTC (rev 320341) @@ -1645,11 +1645,18 @@ zval_add_ref(&ch->handlers->write_header->func_name); dupch->handlers->write_header->func_name = ch->handlers->write_header->func_name; } + + 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_ERRORBUFFER, dupch->err.str); curl_easy_setopt(dupch->cp, CURLOPT_FILE, (void *) dupch); curl_easy_setopt(dupch->cp, CURLOPT_INFILE, (void *) dupch); curl_easy_setopt(dupch->cp, CURLOPT_WRITEHEADER, (void *) dupch); + curl_easy_setopt(dupch->cp, CURLOPT_PROGRESSDATA, (void *) dupch); efree(dupch->to_free); dupch->to_free = ch->to_free; Added: php/php-src/branches/PHP_5_4/ext/curl/tests/curl_copy_handle_basic_008.phpt =================================================================== --- php/php-src/branches/PHP_5_4/ext/curl/tests/curl_copy_handle_basic_008.phpt (rev 0) +++ php/php-src/branches/PHP_5_4/ext/curl/tests/curl_copy_handle_basic_008.phpt 2011-12-04 01:34:54 UTC (rev 320341) @@ -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