mirror of
https://github.com/php/php-src.git
synced 2026-03-24 08:12:21 +01:00
Merge branch 'PHP-7.0' into PHP-7.1
* PHP-7.0: Fixed bug #72788 (Invalid memory access when using persistent PDO connection) Remove typo'd commit Fix bug 72788: Invalid memory access when database_object_handle is undefined. Also fix memory leak in dbh_free when using persistent PDO connections.
This commit is contained in:
@@ -1499,15 +1499,15 @@ static void dbh_free(pdo_dbh_t *dbh, zend_bool free_persistent)
|
||||
{
|
||||
int i;
|
||||
|
||||
if (dbh->is_persistent && !free_persistent) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (dbh->query_stmt) {
|
||||
zval_ptr_dtor(&dbh->query_stmt_zval);
|
||||
dbh->query_stmt = NULL;
|
||||
}
|
||||
|
||||
if (dbh->is_persistent && !free_persistent) {
|
||||
return;
|
||||
}
|
||||
|
||||
if (dbh->methods) {
|
||||
dbh->methods->closer(dbh);
|
||||
}
|
||||
|
||||
33
ext/pdo/tests/bug_72788.phpt
Normal file
33
ext/pdo/tests/bug_72788.phpt
Normal file
@@ -0,0 +1,33 @@
|
||||
--TEST--
|
||||
PDO Common: Bug #72788 (Invalid memory access when using persistent PDO connection)
|
||||
--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';
|
||||
|
||||
putenv("PDOTEST_ATTR=" . serialize(array(PDO::ATTR_PERSISTENT => true)));
|
||||
|
||||
function test() {
|
||||
$db = PDOTest::factory('PDO', false);
|
||||
$stmt = @$db->query("SELECT 1 FROM TABLE_DOES_NOT_EXIST");
|
||||
if ($stmt === false) {
|
||||
echo "Statement failed as expected\n";
|
||||
}
|
||||
}
|
||||
|
||||
test();
|
||||
test();
|
||||
echo "Done";
|
||||
?>
|
||||
--EXPECT--
|
||||
Statement failed as expected
|
||||
Statement failed as expected
|
||||
Done
|
||||
@@ -16,7 +16,7 @@ try {
|
||||
}
|
||||
|
||||
if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
|
||||
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
|
||||
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../../pdo_mysql/tests/mysql_pdo_test.inc');
|
||||
if (false === MySQLPDOTest::detect_transactional_mysql_engine($db)) {
|
||||
die('skip your mysql configuration does not support working transactions');
|
||||
}
|
||||
@@ -29,7 +29,7 @@ require_once getenv('REDIR_TEST_DIR') . 'pdo_test.inc';
|
||||
$db = PDOTest::factory();
|
||||
|
||||
if ($db->getAttribute(PDO::ATTR_DRIVER_NAME) == 'mysql') {
|
||||
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
|
||||
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . '../../pdo_mysql/tests/mysql_pdo_test.inc');
|
||||
$suf = ' ENGINE=' . MySQLPDOTest::detect_transactional_mysql_engine($db);
|
||||
} else {
|
||||
$suf = '';
|
||||
|
||||
@@ -88,7 +88,8 @@ static int pdo_mysql_stmt_dtor(pdo_stmt_t *stmt) /* {{{ */
|
||||
}
|
||||
#endif
|
||||
|
||||
if (IS_OBJ_VALID(EG(objects_store).object_buckets[Z_OBJ_HANDLE(stmt->database_object_handle)])
|
||||
if (!Z_ISUNDEF(stmt->database_object_handle)
|
||||
&& IS_OBJ_VALID(EG(objects_store).object_buckets[Z_OBJ_HANDLE(stmt->database_object_handle)])
|
||||
&& (!(GC_FLAGS(Z_OBJ(stmt->database_object_handle)) & IS_OBJ_FREE_CALLED))) {
|
||||
while (mysql_more_results(S->H->server)) {
|
||||
MYSQL_RES *res;
|
||||
|
||||
@@ -61,7 +61,8 @@
|
||||
static int pgsql_stmt_dtor(pdo_stmt_t *stmt)
|
||||
{
|
||||
pdo_pgsql_stmt *S = (pdo_pgsql_stmt*)stmt->driver_data;
|
||||
zend_bool server_obj_usable = IS_OBJ_VALID(EG(objects_store).object_buckets[Z_OBJ_HANDLE(stmt->database_object_handle)])
|
||||
zend_bool server_obj_usable = !Z_ISUNDEF(stmt->database_object_handle)
|
||||
&& IS_OBJ_VALID(EG(objects_store).object_buckets[Z_OBJ_HANDLE(stmt->database_object_handle)])
|
||||
&& !(GC_FLAGS(Z_OBJ(stmt->database_object_handle)) & IS_OBJ_FREE_CALLED);
|
||||
|
||||
if (S->result) {
|
||||
|
||||
Reference in New Issue
Block a user