summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Watkins <krakjoe@php.net>2019-04-06 00:55:31 +0200
committerJoe Watkins <krakjoe@php.net>2019-04-06 00:55:46 +0200
commit0d5be6ce91701bcb47efe7a520189e035e38cd08 (patch)
tree9349dec79bfe1df2cd5b34f3a86c8ec62436eacc
parent31fe6cfe763d9b5aae90ace18d9ece34bb0dad1b (diff)
parent9ec1525eb5840f8a38470df65f3a36b43eaf28f0 (diff)
downloadphp-git-0d5be6ce91701bcb47efe7a520189e035e38cd08.tar.gz
Merge branch 'PHP-7.2' into PHP-7.3
* PHP-7.2: Fix bug #77849 Disable cloning of PDO handle/connection objects to avoid segfault
-rw-r--r--NEWS4
-rw-r--r--ext/pdo/pdo_dbh.c1
-rw-r--r--ext/pdo/tests/bug_77849.phpt23
3 files changed, 28 insertions, 0 deletions
diff --git a/NEWS b/NEWS
index 5651067fa9..78c2589439 100644
--- a/NEWS
+++ b/NEWS
@@ -21,6 +21,10 @@ PHP NEWS
- PCRE:
. Fixed bug #77827 (preg_match does not ignore \r in regex flags). (requinix,
cmb)
+
+- PDO:
+ . Fixed bug #77849 (Disable cloning of PDO handle/connection objects).
+ (camporter)
- phpdbg:
. Fixed bug #76801 (too many open files). (alekitto)
diff --git a/ext/pdo/pdo_dbh.c b/ext/pdo/pdo_dbh.c
index 2c92c50edf..36bb2a17ac 100644
--- a/ext/pdo/pdo_dbh.c
+++ b/ext/pdo/pdo_dbh.c
@@ -1390,6 +1390,7 @@ void pdo_dbh_init(void)
pdo_dbh_object_handlers.offset = XtOffsetOf(pdo_dbh_object_t, std);
pdo_dbh_object_handlers.dtor_obj = zend_objects_destroy_object;
pdo_dbh_object_handlers.free_obj = pdo_dbh_free_storage;
+ pdo_dbh_object_handlers.clone_obj = NULL;
pdo_dbh_object_handlers.get_method = dbh_method_get;
pdo_dbh_object_handlers.compare_objects = dbh_compare;
pdo_dbh_object_handlers.get_gc = dbh_get_gc;
diff --git a/ext/pdo/tests/bug_77849.phpt b/ext/pdo/tests/bug_77849.phpt
new file mode 100644
index 0000000000..6643f8c581
--- /dev/null
+++ b/ext/pdo/tests/bug_77849.phpt
@@ -0,0 +1,23 @@
+--TEST--
+PDO Common: Bug #77849 (Unexpected segfault attempting to use cloned PDO object)
+--SKIPIF--
+<?php
+if (!extension_loaded('pdo')) die('skip');
+$dir = getenv('REDIR_TEST_DIR');
+if (false == $dir) die('skip no driver');
+require_once $dir . 'pdo_test.inc';
+PDOTest::skip();
+?>
+--FILE--
+<?php
+if (getenv('REDIR_TEST_DIR') === false) putenv('REDIR_TEST_DIR='.dirname(__FILE__) . '/../../pdo/tests/');
+require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
+
+$db = PDOTest::factory();
+$db2 = clone $db;
+?>
+--EXPECTF--
+Fatal error: Uncaught Error: Trying to clone an uncloneable object of class PDO in %s
+Stack trace:
+#0 {main}
+ thrown in %s on line %d