From 89d854922a40216d6b964cbb380aeb2233496515 Mon Sep 17 00:00:00 2001 From: andrewnester Date: Wed, 1 Feb 2017 13:43:55 +0300 Subject: [PATCH] Fixed #74021 - fetch_array returned broken data --- ext/mysqli/tests/bug73800.phpt | 26 ++++++++++++++++++++++++++ ext/mysqli/tests/bug74021.phpt | 25 +++++++++++++++++++++++++ ext/mysqlnd/mysqlnd_wireprotocol.c | 3 +-- 3 files changed, 52 insertions(+), 2 deletions(-) create mode 100644 ext/mysqli/tests/bug73800.phpt create mode 100644 ext/mysqli/tests/bug74021.phpt diff --git a/ext/mysqli/tests/bug73800.phpt b/ext/mysqli/tests/bug73800.phpt new file mode 100644 index 0000000000000..02dd54762043e --- /dev/null +++ b/ext/mysqli/tests/bug73800.phpt @@ -0,0 +1,26 @@ +--TEST-- +Bug #73800 (sporadic segfault with MYSQLI_OPT_INT_AND_FLOAT_NATIVE) +--SKIPIF-- + +--FILE-- +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) diff --git a/ext/mysqli/tests/bug74021.phpt b/ext/mysqli/tests/bug74021.phpt new file mode 100644 index 0000000000000..a6d83fe88d2ae --- /dev/null +++ b/ext/mysqli/tests/bug74021.phpt @@ -0,0 +1,25 @@ +--TEST-- +Bug #74021 (fetch_array broken data. Data more then MEDIUMBLOB) +--SKIPIF-- + +--FILE-- +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" diff --git a/ext/mysqlnd/mysqlnd_wireprotocol.c b/ext/mysqlnd/mysqlnd_wireprotocol.c index d5495715e0cbf..ba49d02b8b769 100644 --- a/ext/mysqlnd/mysqlnd_wireprotocol.c +++ b/ext/mysqlnd/mysqlnd_wireprotocol.c @@ -1481,7 +1481,7 @@ 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; + *data_size = 0; while (1) { if (FAIL == mysqlnd_read_header(pfc, vio, &header, stats, error_info)) { @@ -1531,7 +1531,6 @@ php_mysqlnd_read_row_ex(MYSQLND_PFC * pfc, pool->free_chunk(pool, *buffer); *buffer = NULL; } - (*data_size)--; DBG_RETURN(ret); } /* }}} */