]> granicus.if.org Git - php/commitdiff
Fix bug #52827 (cURL leaks handle and causes assertion error (CURLOPT_STDERR)).
authorAdam Harvey <aharvey@php.net>
Tue, 14 Sep 2010 10:58:59 +0000 (10:58 +0000)
committerAdam Harvey <aharvey@php.net>
Tue, 14 Sep 2010 10:58:59 +0000 (10:58 +0000)
Patch by Gustavo.

ext/curl/interface.c
ext/curl/tests/bug52827.phpt [new file with mode: 0644]

index edb4a30c87766be553b8937cc275673416ec91a4..24ff940c7316d9a8e6f704eba81618343393eb21 100644 (file)
@@ -1826,7 +1826,6 @@ static int _php_curl_setopt(php_curl *ch, long option, zval **zvalue, zval *retu
                                                }
                                                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;
diff --git a/ext/curl/tests/bug52827.phpt b/ext/curl/tests/bug52827.phpt
new file mode 100644 (file)
index 0000000..85a73fa
--- /dev/null
@@ -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.