Skip to content

Commit 452e008

Browse files
georgebarbarosiedevnexen
authored andcommitted
Fix GH-13354: ext/pgsql: pg_execute, pg_send_query_params and_send_execute null value by reference.
For these, when passing null values by refence, queries return erroneous values unlike pg_query_params behaving as expected. close GH-13355.
1 parent 7096eff commit 452e008

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
@@ -9,6 +9,10 @@ PHP NEWS
99
. Fixed bug #75712 (getenv in php-fpm should not read $_ENV, $_SERVER).
1010
(Jakub Zelenka)
1111

12+
- PGSQL:
13+
. Fixed bug GH-13354 (pg_execute/pg_send_query_params/pg_send_execute
14+
with null value passed by reference). (George Barbarosie)
15+
1216
- Standard:
1317
. Fixed array key as hash to string (case insensitive) comparison typo
1418
for the second operand buffer size (albeit unused for now). (A. Slepykh)

ext/pgsql/pgsql.c

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

12901290
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(pv_param_arr), tmp) {
1291-
1291+
ZVAL_DEREF(tmp);
12921292
if (Z_TYPE_P(tmp) == IS_NULL) {
12931293
params[i] = NULL;
12941294
} else {
@@ -3653,7 +3653,7 @@ PHP_FUNCTION(pg_send_query_params)
36533653
params = (char **)safe_emalloc(sizeof(char *), num_params, 0);
36543654

36553655
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(pv_param_arr), tmp) {
3656-
3656+
ZVAL_DEREF(tmp);
36573657
if (Z_TYPE_P(tmp) == IS_NULL) {
36583658
params[i] = NULL;
36593659
} else {
@@ -3820,7 +3820,7 @@ PHP_FUNCTION(pg_send_execute)
38203820
params = (char **)safe_emalloc(sizeof(char *), num_params, 0);
38213821

38223822
ZEND_HASH_FOREACH_VAL(Z_ARRVAL_P(pv_param_arr), tmp) {
3823-
3823+
ZVAL_DEREF(tmp);
38243824
if (Z_TYPE_P(tmp) == IS_NULL) {
38253825
params[i] = NULL;
38263826
} 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)