From c2854c7863aa01895febfb6503f542fce6825bd6 Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Mon, 14 Oct 2019 16:45:51 +0200 Subject: [PATCH] MDEV-20466: SHOW PROCESSLIST truncates query text on \0 bytes Data should be sent with length. --- mysql-test/r/processlist.result | 1 + mysql-test/r/processlist_MDEV-20466.result | Bin 0 -> 775 bytes mysql-test/t/processlist.test | 2 ++ mysql-test/t/processlist_MDEV-20466.test | 35 +++++++++++++++++++++ sql/sql_show.cc | 8 +++-- 5 files changed, 44 insertions(+), 2 deletions(-) create mode 100644 mysql-test/r/processlist_MDEV-20466.result create mode 100644 mysql-test/t/processlist_MDEV-20466.test diff --git a/mysql-test/r/processlist.result b/mysql-test/r/processlist.result index eb3af67c5bf..55d2425d269 100644 --- a/mysql-test/r/processlist.result +++ b/mysql-test/r/processlist.result @@ -17,3 +17,4 @@ select command, time < 5 from information_schema.processlist where id != connect command time < 5 Sleep 1 set debug_sync='reset'; +End of 5.5 tests diff --git a/mysql-test/r/processlist_MDEV-20466.result b/mysql-test/r/processlist_MDEV-20466.result new file mode 100644 index 0000000000000000000000000000000000000000..7120212d0f03a73094a9dd164838e3ef9a6a9e20 GIT binary patch literal 775 zcmbtSUvJYe5a-qX6esPWOoD0xwue=FD6O|fYMT*fR7glsnmCJD;_G~lO8E4g(}AE* zNW3Ju*!TN)cLtEwhQMp`Q0D|WI89yS!PmJ5V~eIMHNn>l*!5mdMrQ!3D{8(MYH0H( zJ}pgEfk*I8bCa(%9BOPdRE8f6x-&L+{hQF7+cMmAy6Q-Wuc6oY0Xb#PF>!OxAiq@c zd*1~q%t?BmyPSCg@_>$eX5t1G*Qa01sg1HEuJMCDJ{_X?dOBBQiN~W-oA0O^A^<^`^f$>gP z=ydiCjm>cHO>2H=P|@9HwqgSr^|lyKxosuqDR2M|Zj*QoZBNh5WT>}GnaJbO&6u#& zuf~85sL^^4uiu|fL;DG<#RF_-QJUSx$)7YQj;5oi6c0=)mPlTdJ2A($<$;LQv|1?7 zW<_Kx6!#7vc@1b3Erdh#Vi~J6+sxKdghdgbLLefIxZdW*8~Yf7DUhK~V;pW}YxNIM iLE6!%_@9J+Gya_u@OTo*|9AkBmyq}2a&mdxhS5)qp!L20 literal 0 HcmV?d00001 diff --git a/mysql-test/t/processlist.test b/mysql-test/t/processlist.test index a8f8a4ed64c..8a8995f43b0 100644 --- a/mysql-test/t/processlist.test +++ b/mysql-test/t/processlist.test @@ -50,3 +50,5 @@ select command, time < 5 from information_schema.processlist where id != connect disconnect con1; set debug_sync='reset'; + +--echo End of 5.5 tests diff --git a/mysql-test/t/processlist_MDEV-20466.test b/mysql-test/t/processlist_MDEV-20466.test new file mode 100644 index 00000000000..70b56d25d72 --- /dev/null +++ b/mysql-test/t/processlist_MDEV-20466.test @@ -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 diff --git a/sql/sql_show.cc b/sql/sql_show.cc index 0cf992ce25b..998432e8443 100644 --- a/sql/sql_show.cc +++ b/sql/sql_show.cc @@ -2278,8 +2278,12 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose) else protocol->store_null(); protocol->store(thd_info->state_info, system_charset_info); - protocol->store(thd_info->query_string.str(), - thd_info->query_string.charset()); + if (thd_info->query_string.length()) + 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 && !(thd->variables.old_behavior & OLD_MODE_NO_PROGRESS_INFO)) protocol->store(thd_info->progress, 3, &store_buffer);