MFB: Fixed bug #37445 (Fixed crash in pdo_mysql resulting from premature

object destruction).
This commit is contained in:
Ilia Alshanetsky 2006-07-31 20:19:18 +00:00
parent ac7333ce60
commit 0af6ef771e
3 changed files with 24 additions and 0 deletions

View File

@ -575,6 +575,7 @@ static PHP_METHOD(PDO, prepare)
stmt->dbh = dbh;
/* give it a reference to me */
zend_objects_store_add_ref(getThis() TSRMLS_CC);
php_pdo_dbh_addref(dbh TSRMLS_CC);
stmt->database_object_handle = *getThis();
/* we haven't created a lazy object yet */
ZVAL_NULL(&stmt->lazy_object_ref);
@ -1013,6 +1014,7 @@ static PHP_METHOD(PDO, query)
stmt->dbh = dbh;
/* give it a reference to me */
zend_objects_store_add_ref(getThis() TSRMLS_CC);
php_pdo_dbh_addref(dbh TSRMLS_CC);
stmt->database_object_handle = *getThis();
/* we haven't created a lazy object yet */
ZVAL_NULL(&stmt->lazy_object_ref);

View File

@ -2154,6 +2154,7 @@ static void free_statement(pdo_stmt_t *stmt TSRMLS_DC)
do_fetch_opt_finish(stmt, 1 TSRMLS_CC);
zend_objects_store_del_ref(&stmt->database_object_handle TSRMLS_CC);
php_pdo_dbh_delref(stmt->dbh TSRMLS_CC);
efree(stmt);
}

View File

@ -0,0 +1,21 @@
--TEST--
PDO MySQL Bug #37445 (Premature stmt object destruction)
--SKIPIF--
<?php
if (!extension_loaded('pdo') || !extension_loaded('pdo_mysql')) die('skip not loaded');
require dirname(__FILE__) . '/config.inc';
require dirname(__FILE__) . '/../../../ext/pdo/tests/pdo_test.inc';
$db = PDOTest::test_factory(dirname(__FILE__) . '/common.phpt');
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_EMULATE_PREPARES, true);
$stmt = $db->prepare("SELECT 1");
$stmt->bindParam(':a', 'b');
--EXPECTF--
Fatal error: Cannot pass parameter 2 by reference in %s/bug_37445.php on line %d