1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-29 05:21:33 +03:00

MDEV-20466: SHOW PROCESSLIST truncates query text on \0 bytes

Data should be sent with length.
This commit is contained in:
Oleksandr Byelkin
2019-10-14 16:45:51 +02:00
parent ea61b79694
commit c2854c7863
5 changed files with 44 additions and 2 deletions

View File

@ -17,3 +17,4 @@ select command, time < 5 from information_schema.processlist where id != connect
command time < 5 command time < 5
Sleep 1 Sleep 1
set debug_sync='reset'; set debug_sync='reset';
End of 5.5 tests

Binary file not shown.

View File

@ -50,3 +50,5 @@ select command, time < 5 from information_schema.processlist where id != connect
disconnect con1; disconnect con1;
set debug_sync='reset'; set debug_sync='reset';
--echo End of 5.5 tests

View File

@ -0,0 +1,35 @@
--echo # This test has a result that includes \0 byte.
--echo # Such a byte makes diff to treat the whole file as binary,
--echo # and to refuse to diff it.
--echo # That's why this test is put in a separate file,
--echo # so that diff would still work on results of other tests.
source include/have_debug.inc;
source include/have_debug_sync.inc;
--echo #
--echo # MDEV-20466: SHOW PROCESSLIST truncates query text on \0 bytes
--echo #
connect (con1,localhost,root,,);
#select * from information_schema.processlist;
connection con1;
let $q= `select CONCAT("SELECT user FROM mysql.user WHERE user ='some", CHAR(0), "' or sleep (3)")`;
SET DEBUG_SYNC= 'before_join_optimize SIGNAL in_sync';
--send_eval $q;
connection default;
SET DEBUG_SYNC= 'now WAIT_FOR in_sync';
--replace_column 1 ID 3 HOST_NAME 6 TIME 9 TIME_MS
SHOW PROCESSLIST;
disconnect con1;
SET DEBUG_SYNC = 'RESET';
--echo End of 5.5 tests

View File

@ -2278,8 +2278,12 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose)
else else
protocol->store_null(); protocol->store_null();
protocol->store(thd_info->state_info, system_charset_info); protocol->store(thd_info->state_info, system_charset_info);
protocol->store(thd_info->query_string.str(), if (thd_info->query_string.length())
thd_info->query_string.charset()); protocol->store(thd_info->query_string.str(),
thd_info->query_string.length(),
thd_info->query_string.charset());
else
protocol->store_null();
if (!thd->variables.old_mode && if (!thd->variables.old_mode &&
!(thd->variables.old_behavior & OLD_MODE_NO_PROGRESS_INFO)) !(thd->variables.old_behavior & OLD_MODE_NO_PROGRESS_INFO))
protocol->store(thd_info->progress, 3, &store_buffer); protocol->store(thd_info->progress, 3, &store_buffer);