Merge branch 'PHP-7.1'

This commit is contained in:
Nikita Popov 2017-02-12 12:51:12 +01:00
commit fb22a0f48d
3 changed files with 57 additions and 4 deletions

View File

@ -0,0 +1,27 @@
--TEST--
Bug #73800 (sporadic segfault with MYSQLI_OPT_INT_AND_FLOAT_NATIVE)
--SKIPIF--
<?php
require_once('skipif.inc');
require_once('skipifconnectfailure.inc');
if (PHP_INT_SIZE != 8) die('skip requires 64-bit');
?>
--FILE--
<?php
require_once("connect.inc");
$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket);
$link->query('SET @@global.max_allowed_packet = 67108864');
$link->close();
$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket);
$link->options(MYSQLI_OPT_INT_AND_FLOAT_NATIVE, 1);
$res = $link->query("SELECT RPAD('1',9000000,'1') as a,RPAD('1',9000000,'1') as b, 9223372036854775807 as c");
$r = $res->fetch_array();
var_dump($r['c']);
?>
--EXPECT--
int(9223372036854775807)

View File

@ -0,0 +1,25 @@
--TEST--
Bug #74021 (fetch_array broken data. Data more then MEDIUMBLOB)
--SKIPIF--
<?php
require_once('skipif.inc');
require_once('skipifconnectfailure.inc');
?>
--FILE--
<?php
require_once("connect.inc");
$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket);
$link->query('SET @@global.max_allowed_packet = 67108864');
$link->close();
$link = my_mysqli_connect($host, $user, $passwd, $db, $port, $socket);
$res = $link->query("SELECT RPAD('1',9000000,'1') as a,RPAD('1',9000000,'1') as b");
$r = $res->fetch_array();
var_dump(md5($r['a']));
var_dump(md5($r['b']));
?>
--EXPECT--
string(32) "42ca0fd16ab6b6d4b9d47dc0a4a8b12a"
string(32) "42ca0fd16ab6b6d4b9d47dc0a4a8b12a"

View File

@ -1466,6 +1466,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc,
MYSQLND_PACKET_HEADER header;
zend_uchar * p = NULL;
zend_bool first_iteration = TRUE;
size_t prealloc_more_bytes;
DBG_ENTER("php_mysqlnd_read_row_ex");
@ -1481,8 +1482,9 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc,
We're allocating an extra byte, as php_mysqlnd_rowp_read_text_protocol_aux
needs to be able to append a terminating \0 for atoi/atof.
*/
*data_size = 1;
prealloc_more_bytes = 1;
*data_size = 0;
while (1) {
if (FAIL == mysqlnd_read_header(pfc, vio, &header, stats, error_info)) {
ret = FAIL;
@ -1493,7 +1495,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc,
if (first_iteration) {
first_iteration = FALSE;
*buffer = pool->get_chunk(pool, *data_size);
*buffer = pool->get_chunk(pool, *data_size + prealloc_more_bytes);
if (!*buffer) {
ret = FAIL;
break;
@ -1508,7 +1510,7 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc,
/*
We have to realloc the buffer.
*/
if (FAIL == pool->resize_chunk(pool, *buffer, *data_size)) {
if (FAIL == pool->resize_chunk(pool, *buffer, *data_size + prealloc_more_bytes)) {
SET_OOM_ERROR(error_info);
ret = FAIL;
break;
@ -1531,7 +1533,6 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc,
pool->free_chunk(pool, *buffer);
*buffer = NULL;
}
(*data_size)--;
DBG_RETURN(ret);
}
/* }}} */