Fix #79033: Curl timeout error with specific url and post

We must not set an empty mime structure as `CURLOPT_MIMEPOST`; instead
we set it to `NULL` if `CURLOPT_POSTFIELDS` has been set to an empty
array.
This commit is contained in:
Christoph M. Becker 2019-12-28 10:47:03 +01:00
parent 27bb3289ac
commit c47b18a222
3 changed files with 36 additions and 4 deletions

1
NEWS
View file

@ -8,6 +8,7 @@ PHP NEWS
- CURL: - CURL:
. Implemented FR #77711 (CURLFile should support UNICODE filenames). (cmb) . Implemented FR #77711 (CURLFile should support UNICODE filenames). (cmb)
. Fixed bug #79033 (Curl timeout error with specific url and post). (cmb)
- Fileinfo: - Fileinfo:
. Fixed bug #74170 (locale information change after mime_content_type). . Fixed bug #74170 (locale information change after mime_content_type).

View file

@ -2804,7 +2804,7 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue) /* {{{
zend_string *string_key; zend_string *string_key;
zend_ulong num_key; zend_ulong num_key;
#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */ #if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */
curl_mime *mime; curl_mime *mime = NULL;
curl_mimepart *part; curl_mimepart *part;
CURLcode form_error; CURLcode form_error;
#else #else
@ -2819,9 +2819,11 @@ static int _php_curl_setopt(php_curl *ch, zend_long option, zval *zvalue) /* {{{
} }
#if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */ #if LIBCURL_VERSION_NUM >= 0x073800 /* 7.56.0 */
mime = curl_mime_init(ch->cp); if (zend_hash_num_elements(postfields) > 0) {
if (mime == NULL) { mime = curl_mime_init(ch->cp);
return FAILURE; if (mime == NULL) {
return FAILURE;
}
} }
#endif #endif

View file

@ -0,0 +1,29 @@
--TEST--
Bug #79033 (Curl timeout error with specific url and post)
--SKIPIF--
<?php include 'skipif.inc'; ?>
--FILE--
<?php
include 'server.inc';
$host = curl_cli_server_start();
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "{$host}/get.inc?test=post",
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => [],
CURLINFO_HEADER_OUT => true,
CURLOPT_RETURNTRANSFER => true,
]);
var_dump(curl_exec($ch));
var_dump(curl_getinfo($ch)["request_header"]);
?>
--EXPECTF--
string(%d) "array(0) {
}
"
string(90) "POST /get.inc?test=post HTTP/1.1
Host: localhost:%d
Accept: */*
Content-Length: 0
"