From a1c825005888370793739b38f017a8d39d4779b1 Mon Sep 17 00:00:00 2001 From: Guy Lichtman Date: Mon, 26 Jan 2015 18:11:55 +0200 Subject: [PATCH] New offsets added. Fixing issue #98 and a crash seen on percona when changing default database ("use "). --- include/audit_handler.h | 26 ++++++++++++++++++++++++-- offset-extract/offset-extract.sh | 2 +- src/audit_handler.cc | 2 +- src/audit_plugin.cc | 6 +++++- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/include/audit_handler.h b/include/audit_handler.h index 25bb080..9b718a4 100644 --- a/include/audit_handler.h +++ b/include/audit_handler.h @@ -49,7 +49,7 @@ typedef size_t OFFSET; #define MAX_NUM_USER_ELEM 256 /** - * The struct usd to hold offsets. We should have one per version. + * The struct used to hold offsets. We should have one per version. */ typedef struct ThdOffsets { @@ -64,7 +64,9 @@ typedef struct ThdOffsets OFFSET sec_ctx_user; OFFSET sec_ctx_host; OFFSET sec_ctx_ip; - OFFSET sec_ctx_priv_user; + OFFSET sec_ctx_priv_user; + OFFSET db; + OFFSET killed; } ThdOffsets; /* @@ -184,6 +186,26 @@ public: + Audit_formatter::thd_offsets.main_security_ctx); } + static inline const char * thd_db(THD * thd) + { + if(!Audit_formatter::thd_offsets.db) //no offsets use compiled in header + { + return thd->db; + } + return *(const char **) (((unsigned char *) thd) + + Audit_formatter::thd_offsets.db); + } + + static inline int thd_killed(THD * thd) + { + if(!Audit_formatter::thd_offsets.killed) //no offsets use thd_killed function + { + return ::thd_killed(thd); + } + return *(int *) (((unsigned char *) thd) + + Audit_formatter::thd_offsets.killed); + } + static inline const char * thd_inst_main_security_ctx_user(THD * thd) { Security_context * sctx = thd_inst_main_security_ctx(thd); diff --git a/offset-extract/offset-extract.sh b/offset-extract/offset-extract.sh index 2b262b7..c892de4 100644 --- a/offset-extract/offset-extract.sh +++ b/offset-extract/offset-extract.sh @@ -31,7 +31,7 @@ if [ $? = 0 ]; then fi echo "set logging on" > offsets.gdb -echo 'printf "{\"'$MYVER'\",\"'$MYMD5'\", %d, %d, %d, %d, %d, %d, %d, %d, %d, %d}", ((size_t)&((THD *)log_slow_statement)->query_id) - (size_t)log_slow_statement, ((size_t)&((THD *)log_slow_statement)->thread_id) - (size_t)log_slow_statement, ((size_t)&((THD *)log_slow_statement)->main_security_ctx) - (size_t)log_slow_statement, ((size_t)&((THD *)log_slow_statement)->'$COMMAND_MEMBER') - (size_t)log_slow_statement, ((size_t)&((THD *)log_slow_statement)->lex) - (size_t)log_slow_statement, (size_t)&((LEX*)log_slow_statement)->comment - (size_t) log_slow_statement, ((size_t)&((Security_context *)log_slow_statement)->user) - (size_t)log_slow_statement, ((size_t)&((Security_context *)log_slow_statement)->host) - (size_t)log_slow_statement, ((size_t)&((Security_context *)log_slow_statement)->ip) - (size_t)log_slow_statement, ((size_t)&((Security_context *)log_slow_statement)->priv_user) - (size_t)log_slow_statement' >> offsets.gdb +echo 'printf "{\"'$MYVER'\",\"'$MYMD5'\", %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d, %d}", ((size_t)&((THD *)log_slow_statement)->query_id) - (size_t)log_slow_statement, ((size_t)&((THD *)log_slow_statement)->thread_id) - (size_t)log_slow_statement, ((size_t)&((THD *)log_slow_statement)->main_security_ctx) - (size_t)log_slow_statement, ((size_t)&((THD *)log_slow_statement)->'$COMMAND_MEMBER') - (size_t)log_slow_statement, ((size_t)&((THD *)log_slow_statement)->lex) - (size_t)log_slow_statement, (size_t)&((LEX*)log_slow_statement)->comment - (size_t) log_slow_statement, ((size_t)&((Security_context *)log_slow_statement)->user) - (size_t)log_slow_statement, ((size_t)&((Security_context *)log_slow_statement)->host) - (size_t)log_slow_statement, ((size_t)&((Security_context *)log_slow_statement)->ip) - (size_t)log_slow_statement, ((size_t)&((Security_context *)log_slow_statement)->priv_user) - (size_t)log_slow_statement, ((size_t)&((THD *)log_slow_statement)->db) - (size_t)log_slow_statement, ((size_t)&((THD *)log_slow_statement)->killed) - (size_t)log_slow_statement' >> offsets.gdb SYMPARAM="" if [ -n "$2" ]; then diff --git a/src/audit_handler.cc b/src/audit_handler.cc index ccadc27..11b447e 100644 --- a/src/audit_handler.cc +++ b/src/audit_handler.cc @@ -691,7 +691,7 @@ bool ThdSesData::getNextObject(const char ** db_name, const char ** obj_name, co { if(m_firstTable) { - *db_name = getTHD()->db; + *db_name = Audit_formatter::thd_db(getTHD()); *obj_name = NULL; if(obj_type) { diff --git a/src/audit_plugin.cc b/src/audit_plugin.cc index 681a766..cabf95b 100644 --- a/src/audit_plugin.cc +++ b/src/audit_plugin.cc @@ -587,7 +587,11 @@ static int audit_mysql_execute_command(THD *thd) audit(&thd_data); } int res; - if(thd_killed(thd)) +#if defined(MARIADB_BASE_VERSION) + if(Audit_formatter::thd_killed(thd) >= KILL_CONNECTION) +#else + if(Audit_formatter::thd_killed(thd) == THD::KILL_CONNECTION) +#endif { res = 1; }