summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2021-01-18 11:01:01 +0100
committerChristoph M. Becker <cmbecker69@gmx.de>2021-01-18 11:01:01 +0100
commitc321896a372c3358663f2f1e8721c61c46634a0c (patch)
treef0fcd076accc43c54d6b049cb33bba6bb5f7b42b
parent880bf6222415f5bb87a73bc830bfa98ef30c267a (diff)
parent38ad37ad435511391e16983794022a8d1e7d6a14 (diff)
downloadphp-git-c321896a372c3358663f2f1e8721c61c46634a0c.tar.gz
Merge branch 'PHP-7.4' into PHP-8.0
* PHP-7.4: Fix #80595: Resetting POSTFIELDS to empty array breaks request
-rw-r--r--NEWS3
-rw-r--r--ext/curl/interface.c9
-rw-r--r--ext/curl/tests/bug79033.phpt1
-rw-r--r--ext/curl/tests/bug80595.phpt30
4 files changed, 42 insertions, 1 deletions
diff --git a/NEWS b/NEWS
index 2f3baaf8fb..50ed9a6c14 100644
--- a/NEWS
+++ b/NEWS
@@ -15,6 +15,9 @@ PHP NEWS
. Fixed bug #80545 (bcadd('a', 'a') doesn't throw an exception).
(Jens de Nies)
+- Curl:
+ . Fixed bug #80595 (Resetting POSTFIELDS to empty array breaks request). (cmb)
+
- Date:
. Fixed bug #80376 (last day of the month causes runway cpu usage). (Derick)
diff --git a/ext/curl/interface.c b/ext/curl/interface.c
index f01f6f775a..82d97053ee 100644
--- a/ext/curl/interface.c
+++ b/ext/curl/interface.c
@@ -2722,7 +2722,14 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue, bool i
case CURLOPT_POSTFIELDS:
if (Z_TYPE_P(zvalue) == IS_ARRAY) {
- return build_mime_structure_from_hash(ch, zvalue);
+ if (zend_hash_num_elements(HASH_OF(zvalue)) == 0) {
+ /* no need to build the mime structure for empty hashtables;
+ also works around https://github.com/curl/curl/issues/6455 */
+ curl_easy_setopt(ch->cp, CURLOPT_POSTFIELDS, "");
+ error = curl_easy_setopt(ch->cp, CURLOPT_POSTFIELDSIZE, 0);
+ } else {
+ return build_mime_structure_from_hash(ch, zvalue);
+ }
} else {
zend_string *tmp_str;
zend_string *str = zval_get_tmp_string(zvalue, &tmp_str);
diff --git a/ext/curl/tests/bug79033.phpt b/ext/curl/tests/bug79033.phpt
index c70611dda6..1ba75ad0e6 100644
--- a/ext/curl/tests/bug79033.phpt
+++ b/ext/curl/tests/bug79033.phpt
@@ -25,5 +25,6 @@ string(%d) "POST /get.inc?test=post HTTP/1.1
Host: localhost:%d
Accept: */*
Content-Length: 0
+Content-Type: application/x-www-form-urlencoded
"
diff --git a/ext/curl/tests/bug80595.phpt b/ext/curl/tests/bug80595.phpt
new file mode 100644
index 0000000000..48137db4e6
--- /dev/null
+++ b/ext/curl/tests/bug80595.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Bug #80595 (Resetting POSTFIELDS to empty array breaks request)
+--SKIPIF--
+<?php include 'skipif.inc'; ?>
+--FILE--
+<?php
+include 'server.inc';
+$host = curl_cli_server_start();
+$ch = curl_init();
+curl_setopt_array($ch, [
+ CURLOPT_RETURNTRANSFER => true,
+ CURLOPT_POST => true,
+ CURLOPT_URL => "{$host}/get.inc?test=post",
+]);
+
+curl_setopt($ch, CURLOPT_POSTFIELDS, ['foo' => 'bar']);
+var_dump(curl_exec($ch));
+
+curl_setopt($ch, CURLOPT_POSTFIELDS, []);
+var_dump(curl_exec($ch));
+?>
+--EXPECT--
+string(43) "array(1) {
+ ["foo"]=>
+ string(3) "bar"
+}
+"
+string(13) "array(0) {
+}
+"