summaryrefslogtreecommitdiffstats
path: root/php-bug81720.patch
blob: 7c16cf9ee024c4b464b2a8f2198ddb17f485c440 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
From 97f8d26ba4732e7d2bc67b53c329bd70e5116639 Mon Sep 17 00:00:00 2001
From: "Christoph M. Becker" <cmbecker69@gmx.de>
Date: Tue, 17 May 2022 12:59:23 +0200
Subject: [PATCH 1/3] Fix #81720: Uninitialized array in pg_query_params()
 leading to RCE

We must not free parameters which we haven't initialized yet.

We also fix the not directly related issue, that we checked for the
wrong value being `NULL`, potentially causing a segfault.

(cherry picked from commit 55f6895f4b4c677272fd4ee1113acdbd99c4b5ab)
(cherry picked from commit 6f979c832c861fb32e2dbad5e0cc29edcee7c500)
(cherry picked from commit 310b17f5c8938389b1dbd7d8ff5a8144bfb9a351)
(cherry picked from commit 9e7d6a2a1e8f43bdb86a0b6c1199f938f6ba78f5)
(cherry picked from commit f8b8096675156bb0560256af790532e2a810311e)
---
 ext/pgsql/pgsql.c             |  4 ++--
 ext/pgsql/tests/bug81720.phpt | 27 +++++++++++++++++++++++++++
 2 files changed, 29 insertions(+), 2 deletions(-)
 create mode 100644 ext/pgsql/tests/bug81720.phpt

diff --git a/ext/pgsql/pgsql.c b/ext/pgsql/pgsql.c
index b746595250..d37bde7d1f 100644
--- a/ext/pgsql/pgsql.c
+++ b/ext/pgsql/pgsql.c
@@ -1983,7 +1983,7 @@ PHP_FUNCTION(pg_query_params)
 				if (Z_TYPE(tmp_val) != IS_STRING) {
 					php_error_docref(NULL TSRMLS_CC, E_WARNING,"Error converting parameter");
 					zval_dtor(&tmp_val);
-					_php_pgsql_free_params(params, num_params);
+					_php_pgsql_free_params(params, i);
 					RETURN_FALSE;
 				}
 				params[i] = estrndup(Z_STRVAL(tmp_val), Z_STRLEN(tmp_val));
@@ -5132,7 +5132,7 @@ PHP_FUNCTION(pg_send_execute)
 				if (Z_TYPE(tmp_val) != IS_STRING) {
 					php_error_docref(NULL TSRMLS_CC, E_WARNING,"Error converting parameter");
 					zval_dtor(&tmp_val);
-					_php_pgsql_free_params(params, num_params);
+					_php_pgsql_free_params(params, i);
 					RETURN_FALSE;
 				}
 				params[i] = estrndup(Z_STRVAL(tmp_val), Z_STRLEN(tmp_val));
diff --git a/ext/pgsql/tests/bug81720.phpt b/ext/pgsql/tests/bug81720.phpt
new file mode 100644
index 0000000000..d79f1fcdd6
--- /dev/null
+++ b/ext/pgsql/tests/bug81720.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Bug #81720 (Uninitialized array in pg_query_params() leading to RCE)
+--SKIPIF--
+<?php include("skipif.inc"); ?>
+--FILE--
+<?php
+include('config.inc');
+
+$conn = pg_connect($conn_str);
+
+try {
+    pg_query_params($conn, 'SELECT $1, $2', [1, new stdClass()]);
+} catch (Throwable $ex) {
+    echo $ex->getMessage(), PHP_EOL;
+}
+
+try {
+    pg_send_prepare($conn, "my_query", 'SELECT $1, $2');
+    pg_get_result($conn);
+    pg_send_execute($conn, "my_query", [1, new stdClass()]);
+} catch (Throwable $ex) {
+    echo $ex->getMessage(), PHP_EOL;
+}
+?>
+--EXPECT--
+Object of class stdClass could not be converted to string
+Object of class stdClass could not be converted to string
-- 
2.35.3