Fixed bug #60439curl_copy_handle segfault when used with CURLOPT_PROGRESSFUNCTION

This commit is contained in:
Pierrick Charron 2011-12-04 01:34:54 +00:00
parent 3fe47ef089
commit 109346779a
3 changed files with 36 additions and 0 deletions

4
NEWS
View file

@ -26,6 +26,10 @@ PHP NEWS
- 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)

View file

@ -1650,10 +1650,17 @@ PHP_FUNCTION(curl_copy_handle)
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;

View file

@ -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!