]> granicus.if.org Git - php/commitdiff
Fixed bug #68937 (Segfault in curl_multi_exec)
authorXinchen Hui <laruence@php.net>
Fri, 30 Jan 2015 05:12:58 +0000 (13:12 +0800)
committerXinchen Hui <laruence@php.net>
Fri, 30 Jan 2015 05:12:58 +0000 (13:12 +0800)
ext/curl/interface.c
ext/curl/tests/bug68937.phpt [new file with mode: 0644]

index 043e14fdabe5e1861be86e1d2b8415aa280d53a6..dc9071f352c8c4fac998ccd0f715edd14148bb4c 100644 (file)
@@ -1486,8 +1486,12 @@ static size_t curl_read(char *data, size_t size, size_t nmemb, void *ctx)
 
                        ZVAL_RES(&argv[0], ch->res);
                        Z_ADDREF(argv[0]);
-                       ZVAL_RES(&argv[1], t->res);
-                       Z_ADDREF(argv[1]);
+                       if (t->res) {
+                               ZVAL_RES(&argv[1], t->res);
+                               Z_ADDREF(argv[1]);
+                       } else {
+                               ZVAL_NULL(&argv[1]);
+                       }
                        ZVAL_LONG(&argv[2], (int)size * nmemb);
 
                        fci.size = sizeof(fci);
diff --git a/ext/curl/tests/bug68937.phpt b/ext/curl/tests/bug68937.phpt
new file mode 100644 (file)
index 0000000..a661ec0
--- /dev/null
@@ -0,0 +1,32 @@
+--TEST--
+Bug # #68937 (Segfault in curl_multi_exec)
+--SKIPIF--
+<?php 
+if (getenv("SKIP_ONLINE_TESTS")) die("skip online test");
+include 'skipif.inc';
+?>
+--FILE--
+<?php
+
+$ch = curl_init('http://www.google.com/');
+curl_setopt_array($ch, array(
+       CURLOPT_HEADER => false,
+       CURLOPT_RETURNTRANSFER => true,
+       CURLOPT_POST => true,
+       CURLOPT_INFILESIZE => 1,
+       CURLOPT_HTTPHEADER => array(
+               'Content-Length: 1',
+       ),
+       CURLOPT_READFUNCTION => 'curl_read'
+));
+
+function curl_read($ch, $fp, $len) {
+       var_dump($fp);
+       exit;
+}
+
+curl_exec($ch);
+curl_close($ch);
+?>
+--EXPECTF--
+NULL