]> granicus.if.org Git - php/commitdiff
Fixed bug #72570 Segmentation fault when binding parameters on a query without placeh...
authorMatteo Beccati <mbeccati@php.net>
Sun, 10 Jul 2016 12:36:07 +0000 (14:36 +0200)
committerMatteo Beccati <mbeccati@php.net>
Sun, 10 Jul 2016 12:36:07 +0000 (14:36 +0200)
NEWS
ext/pdo_pgsql/pgsql_statement.c
ext/pdo_pgsql/tests/bug72570.phpt [new file with mode: 0644]

diff --git a/NEWS b/NEWS
index 91b1b6469601546540433410f5534207ee989724..9af6d5a1b7b5a094cfd32ba2fb104a07b0ffa348 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -13,6 +13,8 @@ PHP                                                                        NEWS
 
 - PDO_pgsql:
   . Fixed bug #70313 (PDO statement fails to throw exception). (Matteo)
+  . Fixed bug #72570 (Segmentation fault when binding parameters on a query
+    without placeholders). (Matteo)
 
 - SPL:
   . Fixed bug #55701 (GlobIterator throws LogicException). (Valentin VÄ‚LCIU)
index 517a59718a5d5c990e8554cf9286cd2f33d0d5af..a5ee2e993e81d8569b19ffec2a282995294bf537 100644 (file)
@@ -292,6 +292,9 @@ static int pgsql_stmt_param_hook(pdo_stmt_t *stmt, struct pdo_bound_param_data *
                                break;
 
                        case PDO_PARAM_EVT_ALLOC:
+                               if (!stmt->bound_param_map) {
+                                       return 1;
+                               }
                                if (!zend_hash_index_exists(stmt->bound_param_map, param->paramno)) {
                                        pdo_raise_impl_error(stmt->dbh, stmt, "HY093", "parameter was not defined");
                                        return 0;
diff --git a/ext/pdo_pgsql/tests/bug72570.phpt b/ext/pdo_pgsql/tests/bug72570.phpt
new file mode 100644 (file)
index 0000000..1ac68a3
--- /dev/null
@@ -0,0 +1,28 @@
+--TEST--
+PDO PgSQL Bug #72570 (Segmentation fault when binding parameters on a query without placeholders)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo') || !extension_loaded('pdo_pgsql')) die('skip not loaded');
+require dirname(__FILE__) . '/config.inc';
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
+$db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
+$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
+
+$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
+
+$stmt = $db->prepare("SELECT 1");
+
+try {
+       $stmt->execute([1]);
+} catch (PDOException $e) {
+       var_dump($e->getCode());
+}
+
+?>
+--EXPECT--
+string(5) "08P01"