aharvey                                  Tue, 14 Sep 2010 10:58:59 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=303361

Log:
Fix bug #52827 (cURL leaks handle and causes assertion error (CURLOPT_STDERR)).
Patch by Gustavo.

Bug: http://bugs.php.net/52827 (Assigned) cURL leaks handle and causes 
assertion error (CURLOPT_STDERR)
      
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/bug52827.phpt
    U   php/php-src/trunk/ext/curl/interface.c
    A   php/php-src/trunk/ext/curl/tests/bug52827.phpt

Modified: php/php-src/branches/PHP_5_3/NEWS
===================================================================
--- php/php-src/branches/PHP_5_3/NEWS   2010-09-14 10:43:30 UTC (rev 303360)
+++ php/php-src/branches/PHP_5_3/NEWS   2010-09-14 10:58:59 UTC (rev 303361)
@@ -21,6 +21,8 @@
 - Fixed possible crash in mssql_fetch_batch(). (Kalle)
 - Fixed inconsistent backlog default value (-1) in FPM on many systems. (fat)

+- Fixed bug #52827 (cURL leaks handle and causes assertion error
+  (CURLOPT_STDERR)). (Gustavo)
 - Fixed bug #52786 (PHP should reset section to [PHP] after ini sections).
   (Fedora at famillecollet dot com)
 - Fixed bug #52772 (var_dump() doesn't check for the existence of

Modified: php/php-src/branches/PHP_5_3/ext/curl/interface.c
===================================================================
--- php/php-src/branches/PHP_5_3/ext/curl/interface.c   2010-09-14 10:43:30 UTC 
(rev 303360)
+++ php/php-src/branches/PHP_5_3/ext/curl/interface.c   2010-09-14 10:58:59 UTC 
(rev 303361)
@@ -1816,7 +1816,6 @@
                                                }
                                                zval_add_ref(zvalue);
                                                ch->handlers->std_err = *zvalue;
-                                               
zend_list_addref(Z_LVAL_PP(zvalue));
                                        } else {
                                                php_error_docref(NULL 
TSRMLS_CC, E_WARNING, "the provided file handle is not writable");
                                                RETVAL_FALSE;

Added: php/php-src/branches/PHP_5_3/ext/curl/tests/bug52827.phpt
===================================================================
--- php/php-src/branches/PHP_5_3/ext/curl/tests/bug52827.phpt                   
        (rev 0)
+++ php/php-src/branches/PHP_5_3/ext/curl/tests/bug52827.phpt   2010-09-14 
10:58:59 UTC (rev 303361)
@@ -0,0 +1,32 @@
+--TEST--
+Bug #52827 (curl_setopt with CURLOPT_STDERR erroneously increments the 
resource refcount)
+--SKIPIF--
+<?php
+
+if (!extension_loaded('curl')) {
+       exit("skip curl extension not loaded");
+}
+
+?>
+--FILE--
+<?php
+$s = fopen('php://temp/maxmemory=1024','wb+');
+
+/* force conversion of inner stream to STDIO.
+ * This is not necessary in Windows because the
+ * cast to a FILE* handle in curl_setopt already
+ * forces the conversion in that platform. The
+ * reason for this conversion is that the memory
+ * stream has an ugly but working mechanism to
+ * prevent being double freed when it's encapsulated,
+ * while STDIO streams don't. */
+$i = 0;
+while ($i++ < 5000) {
+fwrite($s, str_repeat('a',1024));
+}
+$handle=curl_init('http://www.example.com');
+curl_setopt($handle, CURLOPT_STDERR, $s);
+
+echo "Done.";
+--EXPECTF--
+Done.

Modified: php/php-src/trunk/ext/curl/interface.c
===================================================================
--- php/php-src/trunk/ext/curl/interface.c      2010-09-14 10:43:30 UTC (rev 
303360)
+++ php/php-src/trunk/ext/curl/interface.c      2010-09-14 10:58:59 UTC (rev 
303361)
@@ -1826,7 +1826,6 @@
                                                }
                                                zval_add_ref(zvalue);
                                                ch->handlers->std_err = *zvalue;
-                                               
zend_list_addref(Z_LVAL_PP(zvalue));
                                        } else {
                                                php_error_docref(NULL 
TSRMLS_CC, E_WARNING, "the provided file handle is not writable");
                                                RETVAL_FALSE;

Added: php/php-src/trunk/ext/curl/tests/bug52827.phpt
===================================================================
--- php/php-src/trunk/ext/curl/tests/bug52827.phpt                              
(rev 0)
+++ php/php-src/trunk/ext/curl/tests/bug52827.phpt      2010-09-14 10:58:59 UTC 
(rev 303361)
@@ -0,0 +1,32 @@
+--TEST--
+Bug #52827 (curl_setopt with CURLOPT_STDERR erroneously increments the 
resource refcount)
+--SKIPIF--
+<?php
+
+if (!extension_loaded('curl')) {
+       exit("skip curl extension not loaded");
+}
+
+?>
+--FILE--
+<?php
+$s = fopen('php://temp/maxmemory=1024','wb+');
+
+/* force conversion of inner stream to STDIO.
+ * This is not necessary in Windows because the
+ * cast to a FILE* handle in curl_setopt already
+ * forces the conversion in that platform. The
+ * reason for this conversion is that the memory
+ * stream has an ugly but working mechanism to
+ * prevent being double freed when it's encapsulated,
+ * while STDIO streams don't. */
+$i = 0;
+while ($i++ < 5000) {
+fwrite($s, str_repeat('a',1024));
+}
+$handle=curl_init('http://www.example.com');
+curl_setopt($handle, CURLOPT_STDERR, $s);
+
+echo "Done.";
+--EXPECTF--
+Done.

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to