diff options
author | andrey <andrey@php.net> | 2012-05-02 16:15:35 +0200 |
---|---|---|
committer | andrey <andrey@php.net> | 2012-05-02 16:15:35 +0200 |
commit | cd9e4d1defeb0d111221c6b8670ec39603dc49ff (patch) | |
tree | 49effc7771f50f4ae23248a1f0f9c34f62e55954 | |
parent | 8c41e45eec83abdb57f0f3f447fdfee9c627caaf (diff) | |
parent | 67419499b2869feb0ad91c022da78df7845ab00d (diff) | |
download | php-git-cd9e4d1defeb0d111221c6b8670ec39603dc49ff.tar.gz |
Merge branch 'PHP-5.4'
-rw-r--r-- | ext/mysqlnd/mysqlnd_ps.c | 4 | ||||
-rw-r--r-- | ext/pdo_mysql/tests/bug_61411.phpt | 53 |
2 files changed, 55 insertions, 2 deletions
diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c index f9ff43fe98..90e685654b 100644 --- a/ext/mysqlnd/mysqlnd_ps.c +++ b/ext/mysqlnd/mysqlnd_ps.c @@ -1622,9 +1622,9 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_one_result)(MYSQLND_STMT * const s, unsigned i mysqlnd_stmt_separate_one_result_bind(s, param_no TSRMLS_CC); /* Guaranteed is that stmt->result_bind is NULL */ if (!stmt->result_bind) { - stmt->result_bind = mnd_ecalloc(stmt->field_count, sizeof(MYSQLND_RESULT_BIND)); + stmt->result_bind = mnd_pecalloc(stmt->field_count, sizeof(MYSQLND_RESULT_BIND), stmt->persistent); } else { - stmt->result_bind = mnd_erealloc(stmt->result_bind, stmt->field_count * sizeof(MYSQLND_RESULT_BIND)); + stmt->result_bind = mnd_perealloc(stmt->result_bind, stmt->field_count * sizeof(MYSQLND_RESULT_BIND), stmt->persistent); } if (!stmt->result_bind) { DBG_RETURN(FAIL); diff --git a/ext/pdo_mysql/tests/bug_61411.phpt b/ext/pdo_mysql/tests/bug_61411.phpt new file mode 100644 index 0000000000..794d307873 --- /dev/null +++ b/ext/pdo_mysql/tests/bug_61411.phpt @@ -0,0 +1,53 @@ +--TEST-- +Bug #61411 (PDO Segfaults with PERSISTENT == TRUE && EMULATE_PREPARES == FALSE) +--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(); +$db = MySQLPDOTest::factory(); + +$row = $db->query('SELECT VERSION() as _version')->fetch(PDO::FETCH_ASSOC); +$matches = array(); +if (!preg_match('/^(\d+)\.(\d+)\.(\d+)/ismU', $row['_version'], $matches)) + die(sprintf("skip Cannot determine MySQL Server version\n")); + +$version = $matches[0] * 10000 + $matches[1] * 100 + $matches[2]; +if ($version < 40106) + die(sprintf("skip Need MySQL Server 4.1.6+, found %d.%02d.%02d (%d)\n", + $matches[0], $matches[1], $matches[2], $version)); +?> +--FILE-- +<?php +require_once(dirname(__FILE__) . DIRECTORY_SEPARATOR . 'mysql_pdo_test.inc'); + +$attr = getenv('PDOTEST_ATTR'); +if (!$attr) { + $attr = array(); +} else { + $attr = unserialize($attr); +} +$attr[PDO::ATTR_PERSISTENT] = true; +$attr[PDO::ATTR_EMULATE_PREPARES] = false; +putenv('PDOTEST_ATTR='.serialize($attr)); + +$db = MySQLPDOTest::factory(); + +$stmt = $db->prepare("SELECT 1"); +$stmt->execute(); + +foreach ($stmt as $line) { + var_dump($line); +} + +print "done!"; +?> +--EXPECTF-- +array(2) { + [1]=> + int(1) + [2]=> + int(1) +} +done! |