Skip to content

Commit 94dc6ae

Browse files
Girgiasndossche
andauthored
ext/pgsql: Fix segfaults when attempting to fetch row into a non-instantiable class name (#20180)
Also fix Windows CI with Postgres and CLEAN sections --------- Co-authored-by: Niels Dossche <7771979+nielsdos@users.noreply.github.com>
1 parent 55f7303 commit 94dc6ae

File tree

6 files changed

+64
-10
lines changed

6 files changed

+64
-10
lines changed

.github/scripts/windows/test_task.bat

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

ext/pgsql/pgsql.c

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

18751875
ZVAL_COPY_VALUE(&dataset, return_value);
1876-
object_init_ex(return_value, ce);
1876+
zend_result obj_initialized = object_init_ex(return_value, ce);
1877+
if (UNEXPECTED(obj_initialized == FAILURE)) {
1878+
RETURN_THROWS();
1879+
}
18771880
if (!ce->default_properties_count && !ce->__set) {
18781881
Z_OBJ_P(return_value)->properties = Z_ARR(dataset);
18791882
} else {

ext/pgsql/tests/config.inc

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,3 @@ $view_def = "CREATE VIEW {$view_name} AS SELECT * FROM {$table_name};";
1919
$table_def = "CREATE TABLE {$table_name} (num int, str text, bin bytea);";
2020
$table_def_92 = "CREATE TABLE {$table_name_92} (textary text[], jsn json);";
2121
$field_name = "num"; // For pg_field_num()
22-
23-
?>

ext/pgsql/tests/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-
?>
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

ext/pgsql/tests/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-
?>

0 commit comments

Comments
 (0)