Skip to content

Commit afca514

Browse files
committed
Merge branch 'PHP-8.3' into PHP-8.4
* PHP-8.3: Update NEWS for recent pgsql bugfix ext/pgsql: Fix segfaults when attempting to fetch row into a non-instantiable class name (#20180)
2 parents 6d12688 + bf599d4 commit afca514

File tree

7 files changed

+66
-9
lines changed

7 files changed

+66
-9
lines changed

.github/scripts/windows/test_task.bat

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ if %errorlevel% neq 0 exit /b 3
3636
rem setup PostgreSQL related exts
3737
set PGUSER=postgres
3838
set PGPASSWORD=Password12!
39-
rem set PGSQL_TEST_CONNSTR=host=127.0.0.1 dbname=test port=5432 user=postgres password=Password12!
40-
echo ^<?php $conn_str = "host=127.0.0.1 dbname=test port=5432 user=%PGUSER% password=%PGPASSWORD%"; ?^> >> "./ext/pgsql/tests/config.inc"
39+
set PGSQL_TEST_CONNSTR=host=127.0.0.1 dbname=test port=5432 user=%PGUSER% password=%PGPASSWORD%
4140
set PDO_PGSQL_TEST_DSN=pgsql:host=127.0.0.1 port=5432 dbname=test user=%PGUSER% password=%PGPASSWORD%
4241
set TMP_POSTGRESQL_BIN=%PGBIN%
4342
"%TMP_POSTGRESQL_BIN%\createdb.exe" test

NEWS

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,8 @@ PHP NEWS
6060

6161
- PgSql:
6262
. Fix memory leak when first string conversion fails. (nielsdos)
63+
. Fix segfaults when attempting to fetch row into a non-instantiable class
64+
name. (Girgias, nielsdos)
6365

6466
- Phar:
6567
. Fix memory leak of argument in webPhar. (nielsdos)

ext/pgsql/pgsql.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2064,7 +2064,10 @@ static void php_pgsql_fetch_hash(INTERNAL_FUNCTION_PARAMETERS, zend_long result_
20642064
zval dataset;
20652065

20662066
ZVAL_COPY_VALUE(&dataset, return_value);
2067-
object_init_ex(return_value, ce);
2067+
zend_result obj_initialized = object_init_ex(return_value, ce);
2068+
if (UNEXPECTED(obj_initialized == FAILURE)) {
2069+
RETURN_THROWS();
2070+
}
20682071
if (!ce->default_properties_count && !ce->__set) {
20692072
Z_OBJ_P(return_value)->properties = Z_ARR(dataset);
20702073
} else {

ext/pgsql/tests/inc/config.inc

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,3 @@
66

77
// "test" database must exist. i.e. "createdb test" before testing
88
$conn_str = getenv('PGSQL_TEST_CONNSTR') ?: "host=localhost dbname=test port=5432 user=postgres password=postgres"; // connection string
9-
?>

ext/pgsql/tests/inc/lcmess.inc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -17,5 +17,3 @@ function _set_lc_messages($conn, $lc_messages = 'C')
1717

1818
return true;
1919
}
20-
21-
?>

ext/pgsql/tests/inc/skipif.inc

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
<?php
32
// This script prints "skip" unless:
43
// * the pgsql extension is built-in or loadable, AND
@@ -47,5 +46,3 @@ function skip_bytea_not_escape()
4746
die("skip libpq or backend >= 9.0\n");
4847
}
4948
}
50-
51-
?>
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
--TEST--
2+
pg_fetch_object() with abstract class name
3+
--EXTENSIONS--
4+
pgsql
5+
--SKIPIF--
6+
<?php
7+
include("skipif.inc");
8+
?>
9+
--FILE--
10+
<?php
11+
12+
interface I {}
13+
14+
abstract class C {}
15+
16+
enum E {
17+
case A;
18+
}
19+
20+
include "config.inc";
21+
$table_name = "pg_fetch_object_abstract_class";
22+
$db = pg_connect($conn_str);
23+
pg_query($db, "CREATE TABLE {$table_name} (a integer, b text)");
24+
pg_query($db, "INSERT INTO {$table_name} VALUES(0, 'ABC')");
25+
26+
$sql = "SELECT * FROM $table_name WHERE a = 0";
27+
28+
try {
29+
$result = pg_query($db, $sql);
30+
var_dump(pg_fetch_object($result, NULL, 'I'));
31+
} catch(Throwable $e) {
32+
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
33+
}
34+
35+
try {
36+
$result = pg_query($db, $sql);
37+
var_dump(pg_fetch_object($result, NULL, 'C'));
38+
} catch(Throwable $e) {
39+
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
40+
}
41+
42+
try {
43+
$result = pg_query($db, $sql);
44+
var_dump(pg_fetch_object($result, NULL, 'E'));
45+
} catch(Throwable $e) {
46+
echo $e::class, ': ', $e->getMessage(), PHP_EOL;
47+
}
48+
49+
?>
50+
--CLEAN--
51+
<?php
52+
include('config.inc');
53+
$db = @pg_connect($conn_str);
54+
@pg_query($db, "DROP TABLE IF EXISTS pg_fetch_object_abstract_class cascade");
55+
?>
56+
--EXPECT--
57+
Error: Cannot instantiate interface I
58+
Error: Cannot instantiate abstract class C
59+
Error: Cannot instantiate enum E

0 commit comments

Comments
 (0)