Merge branch 'PHP-7.1'

* PHP-7.1:
  Update NEWS
  Remove unused var
  Fix invalid free of persistent results on error/connection loss in mysqlnd (bug 74376)
This commit is contained in:
Xinchen Hui 2017-04-07 15:21:57 +08:00
commit 36848f6e08
3 changed files with 30 additions and 3 deletions

View file

@ -122,7 +122,7 @@ MYSQLND_METHOD(mysqlnd_stmt, store_result)(MYSQLND_STMT * const s)
} else {
COPY_CLIENT_ERROR(conn->error_info, result->stored_data->error_info);
stmt->result->m.free_result_contents(stmt->result);
mnd_efree(stmt->result);
mnd_pefree(stmt->result, stmt->result->persistent);
stmt->result = NULL;
stmt->state = MYSQLND_STMT_PREPARED;
}
@ -347,7 +347,7 @@ mysqlnd_stmt_prepare_read_eof(MYSQLND_STMT * s)
if (FAIL == (ret = PACKET_READ(fields_eof))) {
if (stmt->result) {
stmt->result->m.free_result_contents(stmt->result);
mnd_efree(stmt->result);
mnd_pefree(stmt->result, stmt->result->persistent);
/* XXX: This will crash, because we will null also the methods.
But seems it happens in extreme cases or doesn't. Should be fixed by exporting a function
(from mysqlnd_driver.c?) to do the reset.

View file

@ -755,7 +755,7 @@ static void swap_blocks(block_info *a, block_info *b) {
int zend_cfg_identify_loops(const zend_op_array *op_array, zend_cfg *cfg, uint32_t *flags) /* {{{ */
{
int i, j, k, n;
int depth, time;
int time;
zend_basic_block *blocks = cfg->blocks;
int *entry_times, *exit_times;
zend_worklist work;

View file

@ -0,0 +1,27 @@
--TEST--
Bug #74376 (Invalid free of persistent results on error/connection loss)
--SKIPIF--
<?php
if (!extension_loaded('pdo') || !extension_loaded('pdo_mysql')) die('skip not loaded');
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'skipif.inc');
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
MySQLPDOTest::skip();
?>
--FILE--
<?php
require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc');
$attr = getenv('PDOTEST_ATTR');
$attr = $attr ? unserialize($attr) : [];
$attr[PDO::ATTR_PERSISTENT] = true;
$attr[PDO::ATTR_EMULATE_PREPARES] = false;
putenv('PDOTEST_ATTR=' . serialize($attr));
$db = MySQLPDOTest::factory();
$stmt = $db->query("select (select 1 union select 2)");
print "ok";
?>
--EXPECTF--
ok