From 694d91da8969cc9ef8af9b7f9b59947faa82508f Mon Sep 17 00:00:00 2001 From: Oleksandr Byelkin Date: Mon, 9 Dec 2024 08:54:17 +0100 Subject: [PATCH] MDEV-35604: SIGSEGV in filter_query_type | log_statement_ex / auditing Take into account that filter_query_type can get empty query after skip_set_statement run on incorrect query. --- .../suite/plugins/r/server_audit_pwd_mask.result | 9 +++++++++ .../suite/plugins/t/server_audit_pwd_mask.test | 16 ++++++++++++++++ plugin/server_audit/server_audit.c | 2 ++ 3 files changed, 27 insertions(+) diff --git a/mysql-test/suite/plugins/r/server_audit_pwd_mask.result b/mysql-test/suite/plugins/r/server_audit_pwd_mask.result index ce90230f1ea..8068bbcf4d8 100644 --- a/mysql-test/suite/plugins/r/server_audit_pwd_mask.result +++ b/mysql-test/suite/plugins/r/server_audit_pwd_mask.result @@ -30,4 +30,13 @@ DROP USER u2; set global server_audit_logging=off; UNINSTALL PLUGIN ed25519; UNINSTALL PLUGIN server_audit; +# +# MDEV-35604: SIGSEGV in filter_query_type | log_statement_ex / auditing +# +INSTALL PLUGIN server_audit SONAME 'server_audit'; +SET GLOBAL server_audit_logging=ON; +SET STATEMENT max_error_count=1 SELECT 1; +ERROR 42000: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'SELECT 1' at line 1 +SET GLOBAL server_audit_logging=OFF; +UNINSTALL SONAME 'server_audit'; # end of 10.5 tests diff --git a/mysql-test/suite/plugins/t/server_audit_pwd_mask.test b/mysql-test/suite/plugins/t/server_audit_pwd_mask.test index b393e22d11e..fe660795ab3 100644 --- a/mysql-test/suite/plugins/t/server_audit_pwd_mask.test +++ b/mysql-test/suite/plugins/t/server_audit_pwd_mask.test @@ -56,4 +56,20 @@ UNINSTALL PLUGIN ed25519; UNINSTALL PLUGIN server_audit; --enable_warnings +--echo # +--echo # MDEV-35604: SIGSEGV in filter_query_type | log_statement_ex / auditing +--echo # + +INSTALL PLUGIN server_audit SONAME 'server_audit'; +SET GLOBAL server_audit_logging=ON; + +--ERROR ER_PARSE_ERROR +SET STATEMENT max_error_count=1 SELECT 1; + +# Cleanup +SET GLOBAL server_audit_logging=OFF; +--disable_warnings +UNINSTALL SONAME 'server_audit'; +--enable_warnings + --echo # end of 10.5 tests diff --git a/plugin/server_audit/server_audit.c b/plugin/server_audit/server_audit.c index 0f1a53183a3..8b49f354f47 100644 --- a/plugin/server_audit/server_audit.c +++ b/plugin/server_audit/server_audit.c @@ -1765,6 +1765,8 @@ static int filter_query_type(const char *query, struct sa_keyword *kwd) char fword[MAX_KEYWORD + 1], nword[MAX_KEYWORD + 1]; int len, nlen= 0; const struct sa_keyword *l_keywords; + if (!query) + return SQLCOM_NOTHING; while (*query && (is_space(*query) || *query == '(' || *query == '/')) {