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

Reply via email to