summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPierrick Charron <pierrick@php.net>2011-12-04 01:34:54 +0000
committerPierrick Charron <pierrick@php.net>2011-12-04 01:34:54 +0000
commit109346779a5929d7fd18aa0dc28732b51cc49d0a (patch)
treefdd483cac5cae055b3791e6e1a5cbf1e81c53f73
parent3fe47ef089fc47ae35d6a7ec16bbf4585293595a (diff)
downloadphp-git-109346779a5929d7fd18aa0dc28732b51cc49d0a.tar.gz
Fixed bug #60439curl_copy_handle segfault when used with CURLOPT_PROGRESSFUNCTION
-rw-r--r--NEWS4
-rw-r--r--ext/curl/interface.c7
-rw-r--r--ext/curl/tests/curl_copy_handle_basic_008.phpt25
3 files changed, 36 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index e7fa0f4403..5a45ad76e0 100644
--- a/NEWS
+++ b/NEWS
@@ -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)
diff --git a/ext/curl/interface.c b/ext/curl/interface.c
index af6133e533..8bbe454ed4 100644
--- a/ext/curl/interface.c
+++ b/ext/curl/interface.c
@@ -1649,11 +1649,18 @@ PHP_FUNCTION(curl_copy_handle)
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;
diff --git a/ext/curl/tests/curl_copy_handle_basic_008.phpt b/ext/curl/tests/curl_copy_handle_basic_008.phpt
new file mode 100644
index 0000000000..692c2df192
--- /dev/null
+++ b/ext/curl/tests/curl_copy_handle_basic_008.phpt
@@ -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!