From a955e4a6233a8fe6341e14f3ee86faa5068497ac Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Mon, 4 Sep 2017 20:05:08 +0300 Subject: [PATCH] MXS-1346: Only parse text queries Only text format queries (COM_QUERY, COM_STMT_PREPARE) can be parsed by the query classifier. Also fixed invalid use of a NULL value in a string constructor. --- .../modules/filter/dbfwfilter/dbfwfilter.cc | 19 ++++++++++++----- .../modules/filter/dbfwfilter/dbfwfilter.hh | 2 +- server/modules/filter/dbfwfilter/rules.cc | 21 ++++++++++++++----- 3 files changed, 31 insertions(+), 11 deletions(-) diff --git a/server/modules/filter/dbfwfilter/dbfwfilter.cc b/server/modules/filter/dbfwfilter/dbfwfilter.cc index 5cefd7805..a0948924b 100644 --- a/server/modules/filter/dbfwfilter/dbfwfilter.cc +++ b/server/modules/filter/dbfwfilter/dbfwfilter.cc @@ -1232,11 +1232,17 @@ static bool command_is_mandatory(const GWBUF *buffer) static std::string get_sql(GWBUF* buffer) { + std::string rval; char *sql; int len; - modutil_extract_SQL(buffer, &sql, &len); - len = MXS_MIN(len, FW_MAX_SQL_LEN); - return std::string(sql, len); + + if (modutil_extract_SQL(buffer, &sql, &len)) + { + len = MXS_MIN(len, FW_MAX_SQL_LEN); + rval.assign(sql, len); + } + + return rval; } DbfwSession::DbfwSession(Dbfw* instance, MXS_SESSION* session): @@ -1250,9 +1256,12 @@ DbfwSession::~DbfwSession() { } -void DbfwSession::set_error(std::string error) +void DbfwSession::set_error(const char* error) { - m_error = error; + if (error) + { + m_error = error; + } } std::string DbfwSession::get_error()const diff --git a/server/modules/filter/dbfwfilter/dbfwfilter.hh b/server/modules/filter/dbfwfilter/dbfwfilter.hh index 99fa9346e..fb4be3679 100644 --- a/server/modules/filter/dbfwfilter/dbfwfilter.hh +++ b/server/modules/filter/dbfwfilter/dbfwfilter.hh @@ -174,7 +174,7 @@ public: DbfwSession(Dbfw* instance, MXS_SESSION* session); ~DbfwSession(); - void set_error(std::string error); + void set_error(const char* error); std::string get_error() const; void clear_error(); int send_error(); diff --git a/server/modules/filter/dbfwfilter/rules.cc b/server/modules/filter/dbfwfilter/rules.cc index 09135120f..4d119872e 100644 --- a/server/modules/filter/dbfwfilter/rules.cc +++ b/server/modules/filter/dbfwfilter/rules.cc @@ -48,12 +48,23 @@ bool Rule::matches_query(DbfwSession* session, GWBUF* buffer, char** msg) const bool Rule::matches_query_type(GWBUF* buffer) const { - qc_query_op_t optype = qc_get_operation(buffer); + bool rval = true; - return on_queries == FW_OP_UNDEFINED || - (on_queries & qc_op_to_fw_op(optype)) || - (MYSQL_IS_COM_INIT_DB(GWBUF_DATA(buffer)) && - (on_queries & FW_OP_CHANGE_DB)); + if (on_queries != FW_OP_UNDEFINED) + { + rval = false; + + if (query_is_sql(buffer)) + { + qc_query_op_t optype = qc_get_operation(buffer); + + rval = (on_queries & qc_op_to_fw_op(optype)) || + (MYSQL_IS_COM_INIT_DB(GWBUF_DATA(buffer)) && + (on_queries & FW_OP_CHANGE_DB)); + } + } + + return rval; } const std::string& Rule::name() const