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

Reply via email to