summaryrefslogtreecommitdiff
path: root/plugin/server_audit/server_audit.c
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/server_audit/server_audit.c')
-rw-r--r--plugin/server_audit/server_audit.c51
1 files changed, 35 insertions, 16 deletions
diff --git a/plugin/server_audit/server_audit.c b/plugin/server_audit/server_audit.c
index e94361de5ad..bfabe763eb7 100644
--- a/plugin/server_audit/server_audit.c
+++ b/plugin/server_audit/server_audit.c
@@ -142,6 +142,13 @@ static int loc_file_errno;
#define logger_init_mutexts loc_logger_init_mutexts
#define logger_time_to_rotate loc_logger_time_to_rotate
+#ifndef HOSTNAME_LENGTH
+#define HOSTNAME_LENGTH 255
+#endif
+#ifndef USERNAME_CHAR_LENGTH
+#define USERNAME_CHAR_LENGTH 128
+#endif
+
static size_t loc_write(File Filedes, const uchar *Buffer, size_t Count)
{
@@ -279,6 +286,7 @@ static my_off_t loc_tell(File fd)
extern MYSQL_PLUGIN_IMPORT char server_version[];
static const char *serv_ver= NULL;
+const char *(*thd_priv_host_ptr)(MYSQL_THD thd, size_t *length);
static int started_mysql= 0;
static int mysql_57_started= 0;
static int debug_server_started= 0;
@@ -305,7 +313,7 @@ static char *big_buffer= NULL;
static size_t big_buffer_alloced= 0;
static unsigned int query_log_limit= 0;
-static char servhost[256];
+static char servhost[HOSTNAME_LENGTH+1];
static uint servhost_len;
static char *syslog_ident;
static char syslog_ident_buffer[128]= "mysql-server_auditing";
@@ -317,9 +325,9 @@ struct connection_info
unsigned long long query_id;
char db[256];
int db_length;
- char user[64];
+ char user[USERNAME_CHAR_LENGTH+1];
int user_length;
- char host[64];
+ char host[HOSTNAME_LENGTH+1];
int host_length;
char ip[64];
int ip_length;
@@ -328,9 +336,9 @@ struct connection_info
char query_buffer[1024];
time_t query_time;
int log_always;
- char proxy[64];
+ char proxy[USERNAME_CHAR_LENGTH+1];
int proxy_length;
- char proxy_host[64];
+ char proxy_host[HOSTNAME_LENGTH+1];
int proxy_host_length;
};
@@ -1142,10 +1150,10 @@ static void setup_connection_simple(struct connection_info *ci)
}
-#define MAX_HOSTNAME 61
+#define MAX_HOSTNAME (HOSTNAME_LENGTH + 1) /* len+1 in mysql.user */
#define USERNAME_LENGTH 384
-static void setup_connection_connect(struct connection_info *cn,
+static void setup_connection_connect(MYSQL_THD thd,struct connection_info *cn,
const struct mysql_event_connection *event)
{
cn->query_id= 0;
@@ -1163,17 +1171,26 @@ static void setup_connection_connect(struct connection_info *cn,
cn->header= 0;
if (event->proxy_user && event->proxy_user[0])
{
- const char *priv_host= event->proxy_user +
- sizeof(char[MAX_HOSTNAME+USERNAME_LENGTH+5]);
+ const char *priv_host;
size_t priv_host_length;
- if (mysql_57_started)
+ if (thd_priv_host_ptr)
{
- priv_host+= sizeof(size_t);
- priv_host_length= *(size_t *) (priv_host + MAX_HOSTNAME);
+ priv_host= (*thd_priv_host_ptr)(thd, &priv_host_length);
}
else
- priv_host_length= strlen(priv_host);
+ {
+ // 5 is "'" around host and user and "@"
+ priv_host= event->proxy_user +
+ sizeof(char[MAX_HOSTNAME + USERNAME_LENGTH + 5]);
+ if (mysql_57_started)
+ {
+ priv_host+= sizeof(size_t);
+ priv_host_length= *(size_t *) (priv_host + MAX_HOSTNAME);
+ }
+ else
+ priv_host_length= strlen(priv_host);
+ }
get_str_n(cn->proxy, &cn->proxy_length, sizeof(cn->proxy),
@@ -1974,7 +1991,7 @@ static struct connection_info ci_disconnect_buffer;
#define AA_FREE_CONNECTION 1
#define AA_CHANGE_USER 2
-static void update_connection_info(struct connection_info *cn,
+static void update_connection_info(MYSQL_THD thd, struct connection_info *cn,
unsigned int event_class, const void *ev, int *after_action)
{
*after_action= 0;
@@ -2095,7 +2112,7 @@ static void update_connection_info(struct connection_info *cn,
switch (event->event_subclass)
{
case MYSQL_AUDIT_CONNECTION_CONNECT:
- setup_connection_connect(cn, event);
+ setup_connection_connect(thd, cn, event);
break;
case MYSQL_AUDIT_CONNECTION_CHANGE_USER:
*after_action= AA_CHANGE_USER;
@@ -2153,7 +2170,7 @@ void auditing(MYSQL_THD thd, unsigned int event_class, const void *ev)
cn= get_loc_info(thd);
}
- update_connection_info(cn, event_class, ev, &after_action);
+ update_connection_info(thd, cn, event_class, ev, &after_action);
if (!logging)
{
@@ -2497,6 +2514,8 @@ static int server_audit_init(void *p __attribute__((unused)))
}
if (!my_hash_init_ptr)
return 1;
+
+ thd_priv_host_ptr= dlsym(RTLD_DEFAULT, "thd_priv_host");
}
if(!(int_mysql_data_home= find_sym("mysql_data_home")))