Skip to content

Commit a9c01b9

Browse files
committed
Merge branch 'PHP-8.2' into PHP-8.3
2 parents 7319ca4 + 452e008 commit a9c01b9

File tree

3 files changed

+87
-3
lines changed

3 files changed

+87
-3
lines changed

NEWS

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ PHP NEWS
1313
. Fixed bug #75712 (getenv in php-fpm should not read $_ENV, $_SERVER).
1414
(Jakub Zelenka)
1515

16+
- PGSQL:
17+
. Fixed bug GH-13354 (pg_execute/pg_send_query_params/pg_send_execute
18+
with null value passed by reference). (George Barbarosie)
19+
1620
- Standard:
1721
. Fixed bug GH-13279 (Instable array during in-place modification in uksort).
1822
(ilutov)

ext/pgsql/pgsql.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1292,7 +1292,7 @@ PHP_FUNCTION(pg_execute)
12921292
params = (char **)safe_emalloc(sizeof(char *), num_params, 0);
12931293

12941294
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(pv_param_arr), tmp) {
1295-
1295+
ZVAL_DEREF(tmp);
12961296
if (Z_TYPE_P(tmp) == IS_NULL) {
12971297
params[i] = NULL;
12981298
} else {
@@ -3702,7 +3702,7 @@ PHP_FUNCTION(pg_send_query_params)
37023702
params = (char **)safe_emalloc(sizeof(char *), num_params, 0);
37033703

37043704
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(pv_param_arr), tmp) {
3705-
3705+
ZVAL_DEREF(tmp);
37063706
if (Z_TYPE_P(tmp) == IS_NULL) {
37073707
params[i] = NULL;
37083708
} else {
@@ -3869,7 +3869,7 @@ PHP_FUNCTION(pg_send_execute)
38693869
params = (char **)safe_emalloc(sizeof(char *), num_params, 0);
38703870

38713871
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(pv_param_arr), tmp) {
3872-
3872+
ZVAL_DEREF(tmp);
38733873
if (Z_TYPE_P(tmp) == IS_NULL) {
38743874
params[i] = NULL;
38753875
} else {

ext/pgsql/tests/gh13354.phpt

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
--TEST--
2+
GH-13354 (null-by-reference handling in pg_execute, pg_send_query_params, pg_send_execute)
3+
--EXTENSIONS--
4+
pgsql
5+
--SKIPIF--
6+
<?php include("skipif.inc"); ?>
7+
--FILE--
8+
<?php
9+
include 'config.inc';
10+
11+
$db = pg_connect($conn_str);
12+
$val = null;
13+
14+
$query = 'SELECT $1::text IS NULL;';
15+
$params_null = [null];
16+
$params_null_by_ref = [&$val];
17+
18+
pg_prepare($db, 'test', $query);
19+
20+
21+
// method 1, pg_execute
22+
$val = null;
23+
$res = pg_execute($db, 'test', $params_null);
24+
echo "pg_execute, null value: " . pg_fetch_result($res, 0, 0) . "\n";
25+
pg_free_result($res);
26+
27+
$res = pg_execute($db, 'test', $params_null_by_ref);
28+
echo "pg_execute, null value by reference: " . pg_fetch_result($res, 0, 0) . "\n";
29+
pg_free_result($res);
30+
31+
32+
// method 2, pg_query_params
33+
$res = pg_query_params($db, $query, $params_null);
34+
echo "pg_query_params, null value: " . pg_fetch_result($res, 0, 0) . "\n";
35+
pg_free_result($res);
36+
37+
$res = pg_query_params($db, $query, $params_null_by_ref);
38+
echo "pg_query_params, null value by reference: " . pg_fetch_result($res, 0, 0) . "\n";
39+
pg_free_result($res);
40+
41+
42+
// method 3, pg_send_query_params
43+
$res = pg_send_query_params($db, $query, $params_null);
44+
pg_consume_input($db);
45+
$res = pg_get_result($db);
46+
echo "pg_send_query_params, null value: " . pg_fetch_result($res, 0, 0) . "\n";
47+
pg_free_result($res);
48+
49+
$res = pg_send_query_params($db, $query, $params_null_by_ref);
50+
pg_consume_input($db);
51+
$res = pg_get_result($db);
52+
echo "pg_send_query_params, null value by reference: " . pg_fetch_result($res, 0, 0) . "\n";
53+
pg_free_result($res);
54+
55+
56+
// method 4, pg_send_prepare, pg_send_execute
57+
pg_send_execute($db, 'test', $params_null);
58+
pg_consume_input($db);
59+
$res = pg_get_result($db);
60+
echo "pg_send_execute, null value: " . pg_fetch_result($res, 0, 0) . "\n";
61+
pg_free_result($res);
62+
63+
pg_send_execute($db, 'test', $params_null_by_ref);
64+
pg_consume_input($db);
65+
$res = pg_get_result($db);
66+
echo "pg_send_execute, null value by reference: " . pg_fetch_result($res, 0, 0) . "\n";
67+
pg_free_result($res);
68+
69+
pg_close($db);
70+
71+
?>
72+
--EXPECT--
73+
pg_execute, null value: t
74+
pg_execute, null value by reference: t
75+
pg_query_params, null value: t
76+
pg_query_params, null value by reference: t
77+
pg_send_query_params, null value: t
78+
pg_send_query_params, null value by reference: t
79+
pg_send_execute, null value: t
80+
pg_send_execute, null value by reference: t

0 commit comments

Comments
 (0)