Merge branch 'PHP-8.2'

* PHP-8.2:
  Fixed bug GH-10270 Unable to return CURL_READFUNC_PAUSE in readfunc callback
  Fix GH-10672 (pg_lo_open segfaults in the strict_types mode)
This commit is contained in:
George Peter Banyard 2023-02-24 14:33:47 +00:00
commit 51b70e4414
No known key found for this signature in database
GPG key ID: 3306078E3194AEBD
5 changed files with 92 additions and 1 deletions

View file

@ -811,6 +811,8 @@ static size_t curl_read(char *data, size_t size, size_t nmemb, void *ctx)
if (Z_TYPE(retval) == IS_STRING) { if (Z_TYPE(retval) == IS_STRING) {
length = MIN((int) (size * nmemb), Z_STRLEN(retval)); length = MIN((int) (size * nmemb), Z_STRLEN(retval));
memcpy(data, Z_STRVAL(retval), length); memcpy(data, Z_STRVAL(retval), length);
} else if (Z_TYPE(retval) == IS_LONG) {
length = Z_LVAL_P(&retval);
} }
zval_ptr_dtor(&retval); zval_ptr_dtor(&retval);
} }

View file

@ -0,0 +1,47 @@
--TEST--
Test CURL_READFUNC_PAUSE and curl_pause()
--EXTENSIONS--
curl
--FILE--
<?php
include 'server.inc';
$host = curl_cli_server_start();
class Input {
private static $RESPONSES = [
'Foo bar ',
CURL_READFUNC_PAUSE,
'baz qux',
null
];
private int $res = 0;
public function __invoke($ch, $hReadHandle, $iMaxOut)
{
return self::$RESPONSES[$this->res++];
}
}
$inputHandle = fopen(__FILE__, 'r');
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "{$host}/get.inc?test=input");
curl_setopt($ch, CURLOPT_UPLOAD, 1);
curl_setopt($ch, CURLOPT_READFUNCTION, new Input);
curl_setopt($ch, CURLOPT_INFILE, $inputHandle);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$mh = curl_multi_init();
curl_multi_add_handle($mh, $ch);
do {
$status = curl_multi_exec($mh, $active);
curl_pause($ch, CURLPAUSE_CONT);
if ($active) {
usleep(100);
curl_multi_select($mh);
}
} while ($active && $status == CURLM_OK);
echo curl_multi_getcontent($ch);
?>
--EXPECT--
string(15) "Foo bar baz qux"

View file

@ -4,6 +4,9 @@
case 'post': case 'post':
var_dump($_POST); var_dump($_POST);
break; break;
case 'input':
var_dump(file_get_contents('php://input'));
break;
case 'getpost': case 'getpost':
var_dump($_GET); var_dump($_GET);
var_dump($_POST); var_dump($_POST);

View file

@ -2338,7 +2338,7 @@ PHP_FUNCTION(pg_lo_open)
CHECK_PGSQL_LINK(link); CHECK_PGSQL_LINK(link);
} }
else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(), else if (zend_parse_parameters_ex(ZEND_PARSE_PARAMS_QUIET, ZEND_NUM_ARGS(),
"Ols", &pgsql_link, pgsql_link_ce, &oid_long, &mode) == SUCCESS) { "OlS", &pgsql_link, pgsql_link_ce, &oid_long, &mode) == SUCCESS) {
if (oid_long <= (zend_long)InvalidOid) { if (oid_long <= (zend_long)InvalidOid) {
zend_value_error("Invalid OID value passed"); zend_value_error("Invalid OID value passed");
RETURN_THROWS(); RETURN_THROWS();

View file

@ -0,0 +1,39 @@
--TEST--
GH-10672 (pg_lo_open segfaults in the strict_types mode)
--EXTENSIONS--
pgsql
--SKIPIF--
<?php
include("skipif.inc");
?>
--FILE--
<?php
declare(strict_types=1);
include "config.inc";
$db = pg_connect($conn_str);
pg_query($db, "DROP TABLE IF EXISTS gh10672");
pg_query($db, "CREATE TABLE gh10672 (bar text);");
// Begin a transaction
pg_query($db, 'BEGIN');
// Create an empty large object
$oid = pg_lo_create($db);
if ($oid === false) {
die(pg_last_error($db));
}
// Open the large object for writing
$lob = pg_lo_open($db, $oid, 'w');
if ($oid === false) {
die(pg_last_error($db));
}
echo 'The large object has been opened successfully.', PHP_EOL;
?>
--EXPECT--
The large object has been opened successfully.