1
0
mirror of https://github.com/MariaDB/server.git synced 2025-07-07 06:01:31 +03:00

WL#7076: Backporting wl6715 to support both formats in 5.5, 5.6, 5.7

Backporting wl6715 to mysql-5.5
This commit is contained in:
Ashish Agarwal
2013-07-02 11:58:39 +05:30
parent 8723f47391
commit e879caf845
16 changed files with 288 additions and 118 deletions

View File

@ -25,7 +25,7 @@
#define MYSQL_AUDIT_CLASS_MASK_SIZE 1 #define MYSQL_AUDIT_CLASS_MASK_SIZE 1
#define MYSQL_AUDIT_INTERFACE_VERSION 0x0300 #define MYSQL_AUDIT_INTERFACE_VERSION 0x0301
/************************************************************************* /*************************************************************************
@ -59,6 +59,10 @@ struct mysql_event_general
struct charset_info_st *general_charset; struct charset_info_st *general_charset;
unsigned long long general_time; unsigned long long general_time;
unsigned long long general_rows; unsigned long long general_rows;
MYSQL_LEX_STRING general_host;
MYSQL_LEX_STRING general_sql_command;
MYSQL_LEX_STRING general_external_user;
MYSQL_LEX_STRING general_ip;
}; };

View File

@ -210,6 +210,10 @@ struct mysql_event_general
struct charset_info_st *general_charset; struct charset_info_st *general_charset;
unsigned long long general_time; unsigned long long general_time;
unsigned long long general_rows; unsigned long long general_rows;
MYSQL_LEX_STRING general_host;
MYSQL_LEX_STRING general_sql_command;
MYSQL_LEX_STRING general_external_user;
MYSQL_LEX_STRING general_ip;
}; };
struct mysql_event_connection struct mysql_event_connection
{ {

View File

@ -699,7 +699,8 @@ int check_embedded_connection(MYSQL *mysql, const char *db)
thd_init_client_charset(thd, mysql->charset->number); thd_init_client_charset(thd, mysql->charset->number);
thd->update_charset(); thd->update_charset();
Security_context *sctx= thd->security_ctx; Security_context *sctx= thd->security_ctx;
sctx->host_or_ip= sctx->host= (char*) my_localhost; sctx->set_phost(my_localhost);
sctx->host_or_ip= sctx->get_host()->ptr();
strmake(sctx->priv_host, (char*) my_localhost, MAX_HOSTNAME-1); strmake(sctx->priv_host, (char*) my_localhost, MAX_HOSTNAME-1);
strmake(sctx->priv_user, mysql->user, USERNAME_LENGTH-1); strmake(sctx->priv_user, mysql->user, USERNAME_LENGTH-1);
sctx->user= my_strdup(mysql->user, MYF(0)); sctx->user= my_strdup(mysql->user, MYF(0));
@ -727,14 +728,14 @@ int check_embedded_connection(MYSQL *mysql, const char *db)
if (mysql->options.client_ip) if (mysql->options.client_ip)
{ {
sctx->host= my_strdup(mysql->options.client_ip, MYF(0)); sctx->set_host(my_strdup(mysql->options.client_ip, MYF(0)));
sctx->ip= my_strdup(sctx->host, MYF(0)); sctx->set_ip(my_strdup(sctx->host()->ptr(), MYF(0)));
} }
else else
sctx->host= (char*)my_localhost; sctx->set_host((char*)my_localhost);
sctx->host_or_ip= sctx->host; sctx->host_or_ip= sctx->host->ptr();
if (acl_check_host(sctx->host, sctx->ip)) if (acl_check_host(sctx->get_host()->ptr(), sctx->get_ip()->ptr()))
goto err; goto err;
/* construct a COM_CHANGE_USER packet */ /* construct a COM_CHANGE_USER packet */

View File

@ -1218,9 +1218,11 @@ bool LOGGER::slow_log_print(THD *thd, const char *query, uint query_length,
user_host_len= (strxnmov(user_host_buff, MAX_USER_HOST_SIZE, user_host_len= (strxnmov(user_host_buff, MAX_USER_HOST_SIZE,
sctx->priv_user ? sctx->priv_user : "", "[", sctx->priv_user ? sctx->priv_user : "", "[",
sctx->user ? sctx->user : "", "] @ ", sctx->user ? sctx->user : "", "] @ ",
sctx->host ? sctx->host : "", " [", sctx->get_host()->length() ?
sctx->ip ? sctx->ip : "", "]", NullS) - sctx->get_host()->ptr() : "", " [",
user_host_buff); sctx->get_ip()->length() ? sctx->get_ip()->ptr() :
"", "]", NullS) - user_host_buff);
current_time= my_time_possible_from_micro(current_utime); current_time= my_time_possible_from_micro(current_utime);
if (thd->start_utime) if (thd->start_utime)

View File

@ -3085,6 +3085,44 @@ SHOW_VAR com_status_vars[]= {
{NullS, NullS, SHOW_LONG} {NullS, NullS, SHOW_LONG}
}; };
LEX_CSTRING sql_statement_names[(uint) SQLCOM_END + 1];
void init_sql_statement_names()
{
static LEX_CSTRING empty= { C_STRING_WITH_LEN("") };
char *first_com= (char*) offsetof(STATUS_VAR, com_stat[0]);
char *last_com= (char*) offsetof(STATUS_VAR, com_stat[(uint) SQLCOM_END]);
int record_size= (char*) offsetof(STATUS_VAR, com_stat[1])
- (char*) offsetof(STATUS_VAR, com_stat[0]);
char *ptr;
uint i;
uint com_index;
for (i= 0; i < ((uint) SQLCOM_END + 1); i++)
sql_statement_names[i]= empty;
SHOW_VAR *var= &com_status_vars[0];
while (var->name != NULL)
{
ptr= var->value;
if ((first_com <= ptr) && (ptr <= last_com))
{
com_index= ((int)(ptr - first_com))/record_size;
DBUG_ASSERT(com_index < (uint) SQLCOM_END);
sql_statement_names[com_index].str= var->name;
/* TODO: Change SHOW_VAR::name to a LEX_STRING, to avoid strlen() */
sql_statement_names[com_index].length= strlen(var->name);
}
var++;
}
DBUG_ASSERT(strcmp(sql_statement_names[(uint) SQLCOM_SELECT].str, "select") == 0);
DBUG_ASSERT(strcmp(sql_statement_names[(uint) SQLCOM_SIGNAL].str, "signal") == 0);
sql_statement_names[(uint) SQLCOM_END].str= "error";
}
/** /**
Create the name of the default general log file Create the name of the default general log file
@ -4274,6 +4312,7 @@ int mysqld_main(int argc, char **argv)
/* Must be initialized early for comparison of options name */ /* Must be initialized early for comparison of options name */
system_charset_info= &my_charset_utf8_general_ci; system_charset_info= &my_charset_utf8_general_ci;
init_sql_statement_names();
sys_var_init(); sys_var_init();
#ifdef WITH_PERFSCHEMA_STORAGE_ENGINE #ifdef WITH_PERFSCHEMA_STORAGE_ENGINE
@ -5352,7 +5391,7 @@ void handle_connections_sockets()
continue; continue;
} }
if (sock == unix_sock) if (sock == unix_sock)
thd->security_ctx->host=(char*) my_localhost; thd->security_ctx->set_host((char*) my_localhost);
create_new_thread(thd); create_new_thread(thd);
} }

View File

@ -218,6 +218,7 @@ extern I_List<THD> threads;
extern char err_shared_dir[]; extern char err_shared_dir[];
extern TYPELIB thread_handling_typelib; extern TYPELIB thread_handling_typelib;
extern my_decimal decimal_zero; extern my_decimal decimal_zero;
void init_sql_statement_names();
/* /*
THR_MALLOC is a key which will be used to set/get MEM_ROOT** for a thread, THR_MALLOC is a key which will be used to set/get MEM_ROOT** for a thread,

View File

@ -1309,8 +1309,8 @@ bool acl_getroot(Security_context *sctx, char *user, char *host,
(host ? host : "(NULL)"), (ip ? ip : "(NULL)"), (host ? host : "(NULL)"), (ip ? ip : "(NULL)"),
user, (db ? db : "(NULL)"))); user, (db ? db : "(NULL)")));
sctx->user= user; sctx->user= user;
sctx->host= host; sctx->set_host(host);
sctx->ip= ip; sctx->set_ip(ip);
sctx->host_or_ip= host ? host : (ip ? ip : ""); sctx->host_or_ip= host ? host : (ip ? ip : "");
if (!initialized) if (!initialized)
@ -2205,7 +2205,7 @@ static bool test_if_create_new_users(THD *thd)
C_STRING_WITH_LEN("user"), "user", TL_WRITE); C_STRING_WITH_LEN("user"), "user", TL_WRITE);
create_new_users= 1; create_new_users= 1;
db_access=acl_get(sctx->host, sctx->ip, db_access=acl_get(sctx->get_host()->ptr(), sctx->get_ip()->ptr(),
sctx->priv_user, tl.db, 0); sctx->priv_user, tl.db, 0);
if (!(db_access & INSERT_ACL)) if (!(db_access & INSERT_ACL))
{ {
@ -4631,7 +4631,8 @@ bool check_grant(THD *thd, ulong want_access, TABLE_LIST *tables,
} }
continue; continue;
} }
GRANT_TABLE *grant_table= table_hash_search(sctx->host, sctx->ip, GRANT_TABLE *grant_table= table_hash_search(sctx->get_host()->ptr(),
sctx->get_ip()->ptr(),
tl->get_db_name(), tl->get_db_name(),
sctx->priv_user, sctx->priv_user,
tl->get_table_name(), tl->get_table_name(),
@ -4721,10 +4722,10 @@ bool check_grant_column(THD *thd, GRANT_INFO *grant,
if (grant->version != grant_version) if (grant->version != grant_version)
{ {
grant->grant_table= grant->grant_table=
table_hash_search(sctx->host, sctx->ip, db_name, table_hash_search(sctx->get_host()->ptr(), sctx->get_ip()->ptr(),
sctx->priv_user, db_name, sctx->priv_user,
table_name, 0); /* purecov: inspected */ table_name, 0); /* purecov: inspected */
grant->version= grant_version; /* purecov: inspected */ grant->version= grant_version; /* purecov: inspected */
} }
if (!(grant_table= grant->grant_table)) if (!(grant_table= grant->grant_table))
goto err; /* purecov: deadcode */ goto err; /* purecov: deadcode */
@ -4871,8 +4872,8 @@ bool check_grant_all_columns(THD *thd, ulong want_access_arg,
if (grant->version != grant_version) if (grant->version != grant_version)
{ {
grant->grant_table= grant->grant_table=
table_hash_search(sctx->host, sctx->ip, db_name, table_hash_search(sctx->get_host()->ptr(), sctx->get_ip()->ptr(),
sctx->priv_user, db_name, sctx->priv_user,
table_name, 0); /* purecov: inspected */ table_name, 0); /* purecov: inspected */
grant->version= grant_version; /* purecov: inspected */ grant->version= grant_version; /* purecov: inspected */
} }
@ -4930,7 +4931,8 @@ static bool check_grant_db_routine(THD *thd, const char *db, HASH *hash)
if (strcmp(item->user, sctx->priv_user) == 0 && if (strcmp(item->user, sctx->priv_user) == 0 &&
strcmp(item->db, db) == 0 && strcmp(item->db, db) == 0 &&
compare_hostname(&item->host, sctx->host, sctx->ip)) compare_hostname(&item->host, sctx->get_host()->ptr(),
sctx->get_ip()->ptr()))
{ {
return FALSE; return FALSE;
} }
@ -4974,7 +4976,8 @@ bool check_grant_db(THD *thd,const char *db)
idx); idx);
if (len < grant_table->key_length && if (len < grant_table->key_length &&
!memcmp(grant_table->hash_key,helping,len) && !memcmp(grant_table->hash_key,helping,len) &&
compare_hostname(&grant_table->host, sctx->host, sctx->ip)) compare_hostname(&grant_table->host, sctx->get_host()->ptr(),
sctx->get_ip()->ptr()))
{ {
error= FALSE; /* Found match. */ error= FALSE; /* Found match. */
break; break;
@ -5025,8 +5028,8 @@ bool check_grant_routine(THD *thd, ulong want_access,
for (table= procs; table; table= table->next_global) for (table= procs; table; table= table->next_global)
{ {
GRANT_NAME *grant_proc; GRANT_NAME *grant_proc;
if ((grant_proc= routine_hash_search(host, sctx->ip, table->db, user, if ((grant_proc= routine_hash_search(host, sctx->get_ip()->ptr(), table->db,
table->table_name, is_proc, 0))) user, table->table_name, is_proc, 0)))
table->grant.privilege|= grant_proc->privs; table->grant.privilege|= grant_proc->privs;
if (want_access & ~table->grant.privilege) if (want_access & ~table->grant.privilege)
@ -5081,7 +5084,7 @@ bool check_routine_level_acl(THD *thd, const char *db, const char *name,
Security_context *sctx= thd->security_ctx; Security_context *sctx= thd->security_ctx;
mysql_rwlock_rdlock(&LOCK_grant); mysql_rwlock_rdlock(&LOCK_grant);
if ((grant_proc= routine_hash_search(sctx->priv_host, if ((grant_proc= routine_hash_search(sctx->priv_host,
sctx->ip, db, sctx->get_ip()->ptr(), db,
sctx->priv_user, sctx->priv_user,
name, is_proc, 0))) name, is_proc, 0)))
no_routine_acl= !(grant_proc->privs & SHOW_PROC_ACLS); no_routine_acl= !(grant_proc->privs & SHOW_PROC_ACLS);
@ -5105,8 +5108,8 @@ ulong get_table_grant(THD *thd, TABLE_LIST *table)
#ifdef EMBEDDED_LIBRARY #ifdef EMBEDDED_LIBRARY
grant_table= NULL; grant_table= NULL;
#else #else
grant_table= table_hash_search(sctx->host, sctx->ip, db, sctx->priv_user, grant_table= table_hash_search(sctx->get_host()->ptr(), sctx->get_ip()->ptr(),
table->table_name, 0); db, sctx->priv_user, table->table_name, 0);
#endif #endif
table->grant.grant_table=grant_table; // Remember for column test table->grant.grant_table=grant_table; // Remember for column test
table->grant.version=grant_version; table->grant.version=grant_version;
@ -5150,7 +5153,7 @@ ulong get_column_grant(THD *thd, GRANT_INFO *grant,
{ {
Security_context *sctx= thd->security_ctx; Security_context *sctx= thd->security_ctx;
grant->grant_table= grant->grant_table=
table_hash_search(sctx->host, sctx->ip, table_hash_search(sctx->get_host()->ptr(), sctx->get_ip()->ptr(),
db_name, sctx->priv_user, db_name, sctx->priv_user,
table_name, 0); /* purecov: inspected */ table_name, 0); /* purecov: inspected */
grant->version= grant_version; /* purecov: inspected */ grant->version= grant_version; /* purecov: inspected */
@ -7126,9 +7129,11 @@ bool sp_grant_privileges(THD *thd, const char *sp_db, const char *sp_name,
if ((au= find_acl_user(combo->host.str=(char*)sctx->host_or_ip,combo->user.str,FALSE))) if ((au= find_acl_user(combo->host.str=(char*)sctx->host_or_ip,combo->user.str,FALSE)))
goto found_acl; goto found_acl;
if ((au= find_acl_user(combo->host.str=(char*)sctx->host, combo->user.str,FALSE))) if ((au= find_acl_user(combo->host.str=(char*)sctx->get_host()->ptr(),
combo->user.str,FALSE)))
goto found_acl; goto found_acl;
if ((au= find_acl_user(combo->host.str=(char*)sctx->ip, combo->user.str,FALSE))) if ((au= find_acl_user(combo->host.str=(char*)sctx->get_ip()->ptr(),
combo->user.str,FALSE)))
goto found_acl; goto found_acl;
if((au= find_acl_user(combo->host.str=(char*)"%", combo->user.str, FALSE))) if((au= find_acl_user(combo->host.str=(char*)"%", combo->user.str, FALSE)))
goto found_acl; goto found_acl;
@ -7303,9 +7308,9 @@ acl_check_proxy_grant_access(THD *thd, const char *host, const char *user,
{ {
ACL_PROXY_USER *proxy= dynamic_element(&acl_proxy_users, i, ACL_PROXY_USER *proxy= dynamic_element(&acl_proxy_users, i,
ACL_PROXY_USER *); ACL_PROXY_USER *);
if (proxy->matches(thd->security_ctx->host, if (proxy->matches(thd->security_ctx->get_host()->ptr(),
thd->security_ctx->user, thd->security_ctx->user,
thd->security_ctx->ip, thd->security_ctx->get_ip()->ptr(),
user) && user) &&
proxy->get_with_grant()) proxy->get_with_grant())
{ {
@ -7758,7 +7763,8 @@ void fill_effective_table_privileges(THD *thd, GRANT_INFO *grant,
Security_context *sctx= thd->security_ctx; Security_context *sctx= thd->security_ctx;
DBUG_ENTER("fill_effective_table_privileges"); DBUG_ENTER("fill_effective_table_privileges");
DBUG_PRINT("enter", ("Host: '%s', Ip: '%s', User: '%s', table: `%s`.`%s`", DBUG_PRINT("enter", ("Host: '%s', Ip: '%s', User: '%s', table: `%s`.`%s`",
sctx->priv_host, (sctx->ip ? sctx->ip : "(NULL)"), sctx->priv_host, (sctx->get_ip()->length() ?
sctx->get_ip()->ptr() : "(NULL)"),
(sctx->priv_user ? sctx->priv_user : "(NULL)"), (sctx->priv_user ? sctx->priv_user : "(NULL)"),
db, table)); db, table));
/* --skip-grants */ /* --skip-grants */
@ -7780,14 +7786,15 @@ void fill_effective_table_privileges(THD *thd, GRANT_INFO *grant,
} }
/* db privileges */ /* db privileges */
grant->privilege|= acl_get(sctx->host, sctx->ip, sctx->priv_user, db, 0); grant->privilege|= acl_get(sctx->get_host()->ptr(), sctx->get_ip()->ptr(),
sctx->priv_user, db, 0);
/* table privileges */ /* table privileges */
mysql_rwlock_rdlock(&LOCK_grant); mysql_rwlock_rdlock(&LOCK_grant);
if (grant->version != grant_version) if (grant->version != grant_version)
{ {
grant->grant_table= grant->grant_table=
table_hash_search(sctx->host, sctx->ip, db, table_hash_search(sctx->get_host()->ptr(), sctx->get_ip()->ptr(), db,
sctx->priv_user, sctx->priv_user,
table, 0); /* purecov: inspected */ table, 0); /* purecov: inspected */
grant->version= grant_version; /* purecov: inspected */ grant->version= grant_version; /* purecov: inspected */
@ -9374,8 +9381,8 @@ server_mpvio_initialize(THD *thd, MPVIO_EXT *mpvio, uint connect_errors,
mpvio->thread_id= thd->thread_id; mpvio->thread_id= thd->thread_id;
mpvio->server_status= &thd->server_status; mpvio->server_status= &thd->server_status;
mpvio->net= &thd->net; mpvio->net= &thd->net;
mpvio->ip= thd->security_ctx->ip; mpvio->ip= (char *) thd->security_ctx->get_ip()->ptr();
mpvio->host= thd->security_ctx->host; mpvio->host= (char *) thd->security_ctx->get_host()->ptr();
mpvio->charset_adapter= charset_adapter; mpvio->charset_adapter= charset_adapter;
} }
@ -9524,9 +9531,10 @@ acl_authenticate(THD *thd, uint connect_errors, uint com_change_user_pkt_len)
const char *auth_user = acl_user->user ? acl_user->user : ""; const char *auth_user = acl_user->user ? acl_user->user : "";
ACL_PROXY_USER *proxy_user; ACL_PROXY_USER *proxy_user;
/* check if the user is allowed to proxy as another user */ /* check if the user is allowed to proxy as another user */
proxy_user= acl_find_proxy_user(auth_user, sctx->host, sctx->ip, proxy_user= acl_find_proxy_user(auth_user, sctx->get_host()->ptr(),
sctx->get_ip()->ptr(),
mpvio.auth_info.authenticated_as, mpvio.auth_info.authenticated_as,
&is_proxy_user); &is_proxy_user);
if (is_proxy_user) if (is_proxy_user)
{ {
ACL_USER *acl_proxy_user; ACL_USER *acl_proxy_user;
@ -9651,7 +9659,7 @@ acl_authenticate(THD *thd, uint connect_errors, uint com_change_user_pkt_len)
} }
if (mpvio.auth_info.external_user[0]) if (mpvio.auth_info.external_user[0])
sctx->external_user= my_strdup(mpvio.auth_info.external_user, MYF(0)); sctx->set_external_user(my_strdup(mpvio.auth_info.external_user, MYF(0)));
if (res == CR_OK_HANDSHAKE_COMPLETE) if (res == CR_OK_HANDSHAKE_COMPLETE)
thd->stmt_da->disable_status(); thd->stmt_da->disable_status();

View File

@ -83,6 +83,10 @@ static void general_class_handler(THD *thd, uint event_subtype, va_list ap)
event.general_query_length= va_arg(ap, unsigned int); event.general_query_length= va_arg(ap, unsigned int);
event.general_charset= va_arg(ap, struct charset_info_st *); event.general_charset= va_arg(ap, struct charset_info_st *);
event.general_rows= (unsigned long long) va_arg(ap, ha_rows); event.general_rows= (unsigned long long) va_arg(ap, ha_rows);
event.general_sql_command= va_arg(ap, MYSQL_LEX_STRING);
event.general_host= va_arg(ap, MYSQL_LEX_STRING);
event.general_external_user= va_arg(ap, MYSQL_LEX_STRING);
event.general_ip= va_arg(ap, MYSQL_LEX_STRING);
event_class_dispatch(thd, MYSQL_AUDIT_GENERAL_CLASS, &event); event_class_dispatch(thd, MYSQL_AUDIT_GENERAL_CLASS, &event);
} }

View File

@ -49,8 +49,9 @@ static inline uint make_user_name(THD *thd, char *buf)
return strxnmov(buf, MAX_USER_HOST_SIZE, return strxnmov(buf, MAX_USER_HOST_SIZE,
sctx->priv_user[0] ? sctx->priv_user : "", "[", sctx->priv_user[0] ? sctx->priv_user : "", "[",
sctx->user ? sctx->user : "", "] @ ", sctx->user ? sctx->user : "", "] @ ",
sctx->host ? sctx->host : "", " [", sctx->get_host()->length() ? sctx->get_host()->ptr() :
sctx->ip ? sctx->ip : "", "]", NullS) - buf; "", " [", sctx->get_ip()->length() ? sctx->get_ip()->ptr() :
"", "]", NullS) - buf;
} }
/** /**
@ -75,16 +76,38 @@ void mysql_audit_general_log(THD *thd, time_t time,
#ifndef EMBEDDED_LIBRARY #ifndef EMBEDDED_LIBRARY
if (mysql_global_audit_mask[0] & MYSQL_AUDIT_GENERAL_CLASSMASK) if (mysql_global_audit_mask[0] & MYSQL_AUDIT_GENERAL_CLASSMASK)
{ {
CHARSET_INFO *clientcs= thd ? thd->variables.character_set_client MYSQL_LEX_STRING sql_command, ip, host, external_user;
: global_system_variables.character_set_client; static MYSQL_LEX_STRING empty= { C_STRING_WITH_LEN("") };
if (thd)
{
ip.str= (char *) thd->security_ctx->get_ip()->ptr();
ip.length= thd->security_ctx->get_ip()->length();
host.str= (char *) thd->security_ctx->get_host()->ptr();
host.length= thd->security_ctx->get_host()->length();
external_user.str= (char *) thd->security_ctx->get_external_user()->ptr();
external_user.length= thd->security_ctx->get_external_user()->length();
sql_command.str= (char *) sql_statement_names[thd->lex->sql_command].str;
sql_command.length= sql_statement_names[thd->lex->sql_command].length;
}
else
{
ip= empty;
host= empty;
external_user= empty;
sql_command= empty;
}
const CHARSET_INFO *clientcs= thd ? thd->variables.character_set_client
: global_system_variables.character_set_client;
mysql_audit_notify(thd, MYSQL_AUDIT_GENERAL_CLASS, MYSQL_AUDIT_GENERAL_LOG, mysql_audit_notify(thd, MYSQL_AUDIT_GENERAL_CLASS, MYSQL_AUDIT_GENERAL_LOG,
0, time, user, userlen, cmd, cmdlen, 0, time, user, userlen, cmd, cmdlen, query, querylen,
query, querylen, clientcs, 0); clientcs, 0, sql_command, host, external_user, ip);
} }
#endif #endif
} }
/** /**
Call audit plugins of GENERAL audit class. Call audit plugins of GENERAL audit class.
event_subtype should be set to one of: event_subtype should be set to one of:
@ -106,11 +129,13 @@ void mysql_audit_general(THD *thd, uint event_subtype,
{ {
time_t time= my_time(0); time_t time= my_time(0);
uint msglen= msg ? strlen(msg) : 0; uint msglen= msg ? strlen(msg) : 0;
const char *user;
uint userlen; uint userlen;
const char *user;
char user_buff[MAX_USER_HOST_SIZE]; char user_buff[MAX_USER_HOST_SIZE];
CSET_STRING query; CSET_STRING query;
MYSQL_LEX_STRING ip, host, external_user, sql_command;
ha_rows rows; ha_rows rows;
static MYSQL_LEX_STRING empty= { C_STRING_WITH_LEN("") };
if (thd) if (thd)
{ {
@ -118,17 +143,30 @@ void mysql_audit_general(THD *thd, uint event_subtype,
user= user_buff; user= user_buff;
userlen= make_user_name(thd, user_buff); userlen= make_user_name(thd, user_buff);
rows= thd->warning_info->current_row_for_warning(); rows= thd->warning_info->current_row_for_warning();
ip.str= (char *) thd->security_ctx->get_ip()->ptr();
ip.length= thd->security_ctx->get_ip()->length();
host.str= (char *) thd->security_ctx->get_host()->ptr();
host.length= thd->security_ctx->get_host()->length();
external_user.str= (char *) thd->security_ctx->get_external_user()->ptr();
external_user.length= thd->security_ctx->get_external_user()->length();
sql_command.str= (char *) sql_statement_names[thd->lex->sql_command].str;
sql_command.length= sql_statement_names[thd->lex->sql_command].length;
} }
else else
{ {
user= 0; user= 0;
userlen= 0; userlen= 0;
ip= empty;
host= empty;
external_user= empty;
sql_command= empty;
rows= 0; rows= 0;
} }
mysql_audit_notify(thd, MYSQL_AUDIT_GENERAL_CLASS, event_subtype, mysql_audit_notify(thd, MYSQL_AUDIT_GENERAL_CLASS, event_subtype,
error_code, time, user, userlen, msg, msglen, error_code, time, user, userlen, msg, msglen,
query.str(), query.length(), query.charset(), rows); query.str(), query.length(), query.charset(), rows,
sql_command, host, external_user, ip);
} }
#endif #endif
} }
@ -139,14 +177,13 @@ void mysql_audit_general(THD *thd, uint event_subtype,
(thd)->thread_id, (thd)->security_ctx->user,\ (thd)->thread_id, (thd)->security_ctx->user,\
(thd)->security_ctx->user ? strlen((thd)->security_ctx->user) : 0,\ (thd)->security_ctx->user ? strlen((thd)->security_ctx->user) : 0,\
(thd)->security_ctx->priv_user, strlen((thd)->security_ctx->priv_user),\ (thd)->security_ctx->priv_user, strlen((thd)->security_ctx->priv_user),\
(thd)->security_ctx->external_user,\ (thd)->security_ctx->get_external_user()->ptr(),\
(thd)->security_ctx->external_user ?\ (thd)->security_ctx->get_external_user()->length(),\
strlen((thd)->security_ctx->external_user) : 0,\
(thd)->security_ctx->proxy_user, strlen((thd)->security_ctx->proxy_user),\ (thd)->security_ctx->proxy_user, strlen((thd)->security_ctx->proxy_user),\
(thd)->security_ctx->host,\ (thd)->security_ctx->get_host()->ptr(),\
(thd)->security_ctx->host ? strlen((thd)->security_ctx->host) : 0,\ (thd)->security_ctx->get_host()->length(),\
(thd)->security_ctx->ip,\ (thd)->security_ctx->get_ip()->ptr(),\
(thd)->security_ctx->ip ? strlen((thd)->security_ctx->ip) : 0,\ (thd)->security_ctx->get_ip()->length(),\
(thd)->db, (thd)->db ? strlen((thd)->db) : 0) (thd)->db, (thd)->db ? strlen((thd)->db) : 0)
#define MYSQL_AUDIT_NOTIFY_CONNECTION_DISCONNECT(thd, errcode)\ #define MYSQL_AUDIT_NOTIFY_CONNECTION_DISCONNECT(thd, errcode)\
@ -160,14 +197,13 @@ void mysql_audit_general(THD *thd, uint event_subtype,
(thd)->thread_id, (thd)->security_ctx->user,\ (thd)->thread_id, (thd)->security_ctx->user,\
(thd)->security_ctx->user ? strlen((thd)->security_ctx->user) : 0,\ (thd)->security_ctx->user ? strlen((thd)->security_ctx->user) : 0,\
(thd)->security_ctx->priv_user, strlen((thd)->security_ctx->priv_user),\ (thd)->security_ctx->priv_user, strlen((thd)->security_ctx->priv_user),\
(thd)->security_ctx->external_user,\ (thd)->security_ctx->get_external_user()->ptr(),\
(thd)->security_ctx->external_user ?\ (thd)->security_ctx->get_external_user()->length(),\
strlen((thd)->security_ctx->external_user) : 0,\
(thd)->security_ctx->proxy_user, strlen((thd)->security_ctx->proxy_user),\ (thd)->security_ctx->proxy_user, strlen((thd)->security_ctx->proxy_user),\
(thd)->security_ctx->host,\ (thd)->security_ctx->get_host()->ptr(),\
(thd)->security_ctx->host ? strlen((thd)->security_ctx->host) : 0,\ (thd)->security_ctx->get_host()->length(),\
(thd)->security_ctx->ip,\ (thd)->security_ctx->get_ip()->ptr(),\
(thd)->security_ctx->ip ? strlen((thd)->security_ctx->ip) : 0,\ (thd)->security_ctx->get_ip()->length(),\
(thd)->db, (thd)->db ? strlen((thd)->db) : 0) (thd)->db, (thd)->db ? strlen((thd)->db) : 0)
#endif /* SQL_AUDIT_INCLUDED */ #endif /* SQL_AUDIT_INCLUDED */

View File

@ -675,7 +675,7 @@ char *thd_security_context(THD *thd, char *buffer, unsigned int length,
unsigned int max_query_len) unsigned int max_query_len)
{ {
String str(buffer, length, &my_charset_latin1); String str(buffer, length, &my_charset_latin1);
const Security_context *sctx= &thd->main_security_ctx; Security_context *sctx= &thd->main_security_ctx;
char header[256]; char header[256];
int len; int len;
/* /*
@ -695,16 +695,16 @@ char *thd_security_context(THD *thd, char *buffer, unsigned int length,
str.length(0); str.length(0);
str.append(header, len); str.append(header, len);
if (sctx->host) if (sctx->get_host()->length())
{ {
str.append(' '); str.append(' ');
str.append(sctx->host); str.append(sctx->get_host()->ptr());
} }
if (sctx->ip) if (sctx->get_ip()->length())
{ {
str.append(' '); str.append(' ');
str.append(sctx->ip); str.append(sctx->get_ip()->ptr());
} }
if (sctx->user) if (sctx->user)
@ -3341,7 +3341,10 @@ void THD::set_status_var_init()
void Security_context::init() void Security_context::init()
{ {
host= user= ip= external_user= 0; user= 0;
ip.set("", 0, system_charset_info);
host.set("", 0, system_charset_info);
external_user.set("", 0, system_charset_info);
host_or_ip= "connecting host"; host_or_ip= "connecting host";
priv_user[0]= priv_host[0]= proxy_user[0]= '\0'; priv_user[0]= priv_host[0]= proxy_user[0]= '\0';
master_access= 0; master_access= 0;
@ -3350,29 +3353,35 @@ void Security_context::init()
#endif #endif
} }
void Security_context::destroy() void Security_context::destroy()
{ {
// If not pointer to constant if (host.ptr() != my_localhost && host.length())
if (host != my_localhost)
{ {
my_free(host); char *c= (char *) host.ptr();
host= NULL; host.set("", 0, system_charset_info);
my_free(c);
} }
if (user != delayed_user)
if (user)
{ {
my_free(user); my_free(user);
user= NULL; user= NULL;
} }
if (external_user) if (external_user.length())
{ {
my_free(external_user); char *c= (char *) external_user.ptr();
user= NULL; external_user.set("", 0, system_charset_info);
my_free(c);
}
if (ip.length())
{
char *c= (char *) ip.ptr();
ip.set("", 0, system_charset_info);
my_free(c);
} }
my_free(ip);
ip= NULL;
} }
@ -3392,6 +3401,45 @@ bool Security_context::set_user(char *user_arg)
return user == 0; return user == 0;
} }
String *Security_context::get_host()
{
return (&host);
}
String *Security_context::get_ip()
{
return (&ip);
}
String *Security_context::get_external_user()
{
return (&external_user);
}
void Security_context::set_host(const char *str)
{
uint len= str ? strlen(str) : 0;
host.set(str, len, system_charset_info);
}
void Security_context::set_ip(const char *str)
{
uint len= str ? strlen(str) : 0;
ip.set(str, len, system_charset_info);
}
void Security_context::set_external_user(const char *str)
{
uint len= str ? strlen(str) : 0;
external_user.set(str, len, system_charset_info);
}
void Security_context::set_host(const char * str, size_t len)
{
host.set(str, len, system_charset_info);
host.c_ptr_quick();
}
#ifndef NO_EMBEDDED_ACCESS_CHECKS #ifndef NO_EMBEDDED_ACCESS_CHECKS
/** /**
Initialize this security context from the passed in credentials Initialize this security context from the passed in credentials

View File

@ -388,6 +388,7 @@ extern const LEX_STRING Diag_condition_item_names[];
#include "sql_lex.h" /* Must be here */ #include "sql_lex.h" /* Must be here */
extern LEX_CSTRING sql_statement_names[(uint) SQLCOM_END + 1];
class Delayed_insert; class Delayed_insert;
class select_result; class select_result;
class Time_zone; class Time_zone;
@ -895,6 +896,11 @@ void xid_cache_delete(XID_STATE *xid_state);
*/ */
class Security_context { class Security_context {
private:
String host;
String ip;
String external_user;
public: public:
Security_context() {} /* Remove gcc warning */ Security_context() {} /* Remove gcc warning */
/* /*
@ -904,13 +910,11 @@ public:
priv_user - The user privilege we are using. May be "" for anonymous user. priv_user - The user privilege we are using. May be "" for anonymous user.
ip - client IP ip - client IP
*/ */
char *host, *user, *ip; char *user;
char priv_user[USERNAME_LENGTH]; char priv_user[USERNAME_LENGTH];
char proxy_user[USERNAME_LENGTH + MAX_HOSTNAME + 5]; char proxy_user[USERNAME_LENGTH + MAX_HOSTNAME + 5];
/* The host privilege we are using */ /* The host privilege we are using */
char priv_host[MAX_HOSTNAME]; char priv_host[MAX_HOSTNAME];
/* The external user (if available) */
char *external_user;
/* points to host if host is available, otherwise points to ip */ /* points to host if host is available, otherwise points to ip */
const char *host_or_ip; const char *host_or_ip;
ulong master_access; /* Global privileges from mysql.user */ ulong master_access; /* Global privileges from mysql.user */
@ -925,7 +929,13 @@ public:
} }
bool set_user(char *user_arg); bool set_user(char *user_arg);
String *get_host();
String *get_ip();
String *get_external_user();
void set_host(const char *p);
void set_ip(const char *p);
void set_external_user(const char *p);
void set_host(const char *str, size_t len);
#ifndef NO_EMBEDDED_ACCESS_CHECKS #ifndef NO_EMBEDDED_ACCESS_CHECKS
bool bool
change_security_context(THD *thd, change_security_context(THD *thd,

View File

@ -38,6 +38,7 @@
#include "sql_acl.h" // acl_getroot, NO_ACCESS, SUPER_ACL #include "sql_acl.h" // acl_getroot, NO_ACCESS, SUPER_ACL
#include "sql_callback.h" #include "sql_callback.h"
#if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY) #if defined(HAVE_OPENSSL) && !defined(EMBEDDED_LIBRARY)
/* /*
Without SSL the handshake consists of one packet. This packet Without SSL the handshake consists of one packet. This packet
@ -490,7 +491,7 @@ static int check_connection(THD *thd)
thd->set_active_vio(net->vio); thd->set_active_vio(net->vio);
#endif #endif
if (!thd->main_security_ctx.host) // If TCP/IP connection if (!thd->main_security_ctx.get_host()->length()) // If TCP/IP connection
{ {
char ip[NI_MAXHOST]; char ip[NI_MAXHOST];
@ -512,25 +513,30 @@ static int check_connection(THD *thd)
};); };);
/* END : DEBUG */ /* END : DEBUG */
if (!(thd->main_security_ctx.ip= my_strdup(ip,MYF(MY_WME)))) thd->main_security_ctx.set_ip(my_strdup(ip, MYF(MY_WME)));
if (!(thd->main_security_ctx.get_ip()->length()))
return 1; /* The error is set by my_strdup(). */ return 1; /* The error is set by my_strdup(). */
thd->main_security_ctx.host_or_ip= thd->main_security_ctx.ip; thd->main_security_ctx.host_or_ip= thd->main_security_ctx.get_ip()->ptr();
if (!(specialflag & SPECIAL_NO_RESOLVE)) if (!(specialflag & SPECIAL_NO_RESOLVE))
{ {
if (ip_to_hostname(&net->vio->remote, thd->main_security_ctx.ip, char *host= (char *) thd->main_security_ctx.get_host()->ptr();
&thd->main_security_ctx.host, &connect_errors)) if (ip_to_hostname(&net->vio->remote,
thd->main_security_ctx.get_ip()->ptr(),
&host, &connect_errors))
{ {
my_error(ER_BAD_HOST_ERROR, MYF(0)); my_error(ER_BAD_HOST_ERROR, MYF(0));
return 1; return 1;
} }
/* Cut very long hostnames to avoid possible overflows */ /* Cut very long hostnames to avoid possible overflows */
if (thd->main_security_ctx.host) if (thd->main_security_ctx.get_host()->length())
{ {
if (thd->main_security_ctx.host != my_localhost) if (thd->main_security_ctx.get_host()->ptr() != my_localhost)
thd->main_security_ctx.host[min(strlen(thd->main_security_ctx.host), thd->main_security_ctx.set_host(thd->main_security_ctx.get_host()->ptr(),
HOSTNAME_LENGTH)]= 0; min(thd->main_security_ctx.get_host()->length(),
thd->main_security_ctx.host_or_ip= thd->main_security_ctx.host; HOSTNAME_LENGTH));
thd->main_security_ctx.host_or_ip=
thd->main_security_ctx.get_host()->ptr();
} }
if (connect_errors > max_connect_errors) if (connect_errors > max_connect_errors)
{ {
@ -539,11 +545,14 @@ static int check_connection(THD *thd)
} }
} }
DBUG_PRINT("info",("Host: %s ip: %s", DBUG_PRINT("info",("Host: %s ip: %s",
(thd->main_security_ctx.host ? (thd->main_security_ctx.get_host()->length() ?
thd->main_security_ctx.host : "unknown host"), thd->main_security_ctx.get_host()->ptr() :
(thd->main_security_ctx.ip ? "unknown host"),
thd->main_security_ctx.ip : "unknown ip"))); (thd->main_security_ctx.get_ip()->length() ?
if (acl_check_host(thd->main_security_ctx.host, thd->main_security_ctx.ip)) thd->main_security_ctx.get_ip()->ptr()
: "unknown ip")));
if (acl_check_host(thd->main_security_ctx.get_host()->ptr(),
thd->main_security_ctx.get_ip()->ptr()))
{ {
my_error(ER_HOST_NOT_PRIVILEGED, MYF(0), my_error(ER_HOST_NOT_PRIVILEGED, MYF(0),
thd->main_security_ctx.host_or_ip); thd->main_security_ctx.host_or_ip);
@ -552,9 +561,9 @@ static int check_connection(THD *thd)
} }
else /* Hostname given means that the connection was on a socket */ else /* Hostname given means that the connection was on a socket */
{ {
DBUG_PRINT("info",("Host: %s", thd->main_security_ctx.host)); DBUG_PRINT("info",("Host: %s", thd->main_security_ctx.get_host()->ptr()));
thd->main_security_ctx.host_or_ip= thd->main_security_ctx.host; thd->main_security_ctx.host_or_ip= thd->main_security_ctx.get_host()->ptr();
thd->main_security_ctx.ip= 0; thd->main_security_ctx.set_ip("");
/* Reset sin_addr */ /* Reset sin_addr */
bzero((char*) &net->vio->remote, sizeof(net->vio->remote)); bzero((char*) &net->vio->remote, sizeof(net->vio->remote));
} }

View File

@ -1529,8 +1529,8 @@ bool mysql_change_db(THD *thd, const LEX_STRING *new_db_name, bool force_switch)
db_access= db_access=
test_all_bits(sctx->master_access, DB_ACLS) ? test_all_bits(sctx->master_access, DB_ACLS) ?
DB_ACLS : DB_ACLS :
acl_get(sctx->host, acl_get(sctx->get_host()->ptr(),
sctx->ip, sctx->get_ip()->ptr(),
sctx->priv_user, sctx->priv_user,
new_db_file_name.str, new_db_file_name.str,
FALSE) | sctx->master_access; FALSE) | sctx->master_access;

View File

@ -1893,7 +1893,7 @@ public:
{ {
DBUG_ENTER("Delayed_insert constructor"); DBUG_ENTER("Delayed_insert constructor");
thd.security_ctx->user=(char*) delayed_user; thd.security_ctx->user=(char*) delayed_user;
thd.security_ctx->host=(char*) my_localhost; thd.security_ctx->set_host(my_localhost);
strmake(thd.security_ctx->priv_user, thd.security_ctx->user, strmake(thd.security_ctx->priv_user, thd.security_ctx->user,
USERNAME_LENGTH); USERNAME_LENGTH);
thd.current_tablenr=0; thd.current_tablenr=0;
@ -1939,7 +1939,8 @@ public:
mysql_cond_destroy(&cond_client); mysql_cond_destroy(&cond_client);
thd.unlink(); // Must be unlinked under lock thd.unlink(); // Must be unlinked under lock
my_free(thd.query()); my_free(thd.query());
thd.security_ctx->user= thd.security_ctx->host=0; thd.security_ctx->set_host("");
thd.security_ctx->user= (char *) thd.security_ctx->get_host()->ptr();
thread_count--; thread_count--;
delayed_insert_threads--; delayed_insert_threads--;
mysql_mutex_unlock(&LOCK_thread_count); mysql_mutex_unlock(&LOCK_thread_count);

View File

@ -4806,8 +4806,8 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
if (!(sctx->master_access & SELECT_ACL)) if (!(sctx->master_access & SELECT_ACL))
{ {
if (db && (!thd->db || db_is_pattern || strcmp(db, thd->db))) if (db && (!thd->db || db_is_pattern || strcmp(db, thd->db)))
db_access= acl_get(sctx->host, sctx->ip, sctx->priv_user, db, db_access= acl_get(sctx->get_host()->ptr(), sctx->get_ip()->ptr(),
db_is_pattern); sctx->priv_user, db, db_is_pattern);
else else
{ {
/* get access for current db */ /* get access for current db */
@ -4855,8 +4855,8 @@ check_access(THD *thd, ulong want_access, const char *db, ulong *save_priv,
} }
if (db && (!thd->db || db_is_pattern || strcmp(db,thd->db))) if (db && (!thd->db || db_is_pattern || strcmp(db,thd->db)))
db_access= acl_get(sctx->host, sctx->ip, sctx->priv_user, db, db_access= acl_get(sctx->get_host()->ptr(), sctx->get_ip()->ptr(),
db_is_pattern); sctx->priv_user, db, db_is_pattern);
else else
db_access= sctx->db_access; db_access= sctx->db_access;
DBUG_PRINT("info",("db_access: %lu want_access: %lu", DBUG_PRINT("info",("db_access: %lu want_access: %lu",

View File

@ -795,8 +795,8 @@ bool mysqld_show_create_db(THD *thd, char *dbname,
if (test_all_bits(sctx->master_access, DB_ACLS)) if (test_all_bits(sctx->master_access, DB_ACLS))
db_access=DB_ACLS; db_access=DB_ACLS;
else else
db_access= (acl_get(sctx->host, sctx->ip, sctx->priv_user, dbname, 0) | db_access= (acl_get(sctx->get_host()->ptr(), sctx->get_ip()->ptr(),
sctx->master_access); sctx->priv_user, dbname, 0) | sctx->master_access);
if (!(db_access & DB_ACLS) && check_grant_db(thd,dbname)) if (!(db_access & DB_ACLS) && check_grant_db(thd,dbname))
{ {
my_error(ER_DBACCESS_DENIED_ERROR, MYF(0), my_error(ER_DBACCESS_DENIED_ERROR, MYF(0),
@ -1832,8 +1832,8 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose)
thd_info->user= thd->strdup(tmp_sctx->user ? tmp_sctx->user : thd_info->user= thd->strdup(tmp_sctx->user ? tmp_sctx->user :
(tmp->system_thread ? (tmp->system_thread ?
"system user" : "unauthenticated user")); "system user" : "unauthenticated user"));
if (tmp->peer_port && (tmp_sctx->host || tmp_sctx->ip) && if (tmp->peer_port && (tmp_sctx->get_host()->length() ||
thd->security_ctx->host_or_ip[0]) tmp_sctx->get_ip()->length()) && thd->security_ctx->host_or_ip[0])
{ {
if ((thd_info->host= (char*) thd->alloc(LIST_PROCESS_HOST_LEN+1))) if ((thd_info->host= (char*) thd->alloc(LIST_PROCESS_HOST_LEN+1)))
my_snprintf((char *) thd_info->host, LIST_PROCESS_HOST_LEN, my_snprintf((char *) thd_info->host, LIST_PROCESS_HOST_LEN,
@ -1842,7 +1842,8 @@ void mysqld_list_processes(THD *thd,const char *user, bool verbose)
else else
thd_info->host= thd->strdup(tmp_sctx->host_or_ip[0] ? thd_info->host= thd->strdup(tmp_sctx->host_or_ip[0] ?
tmp_sctx->host_or_ip : tmp_sctx->host_or_ip :
tmp_sctx->host ? tmp_sctx->host : ""); tmp_sctx->get_host()->length() ?
tmp_sctx->get_host()->ptr() : "");
if ((thd_info->db=tmp->db)) // Safe test if ((thd_info->db=tmp->db)) // Safe test
thd_info->db=thd->strdup(thd_info->db); thd_info->db=thd->strdup(thd_info->db);
thd_info->command=(int) tmp->command; thd_info->command=(int) tmp->command;
@ -1934,8 +1935,8 @@ int fill_schema_processlist(THD* thd, TABLE_LIST* tables, COND* cond)
(tmp->system_thread ? "system user" : "unauthenticated user"); (tmp->system_thread ? "system user" : "unauthenticated user");
table->field[1]->store(val, strlen(val), cs); table->field[1]->store(val, strlen(val), cs);
/* HOST */ /* HOST */
if (tmp->peer_port && (tmp_sctx->host || tmp_sctx->ip) && if (tmp->peer_port && (tmp_sctx->get_host()->length() ||
thd->security_ctx->host_or_ip[0]) tmp_sctx->get_ip()->length()) && thd->security_ctx->host_or_ip[0])
{ {
char host[LIST_PROCESS_HOST_LEN + 1]; char host[LIST_PROCESS_HOST_LEN + 1];
my_snprintf(host, LIST_PROCESS_HOST_LEN, "%s:%u", my_snprintf(host, LIST_PROCESS_HOST_LEN, "%s:%u",
@ -3746,7 +3747,8 @@ int get_all_tables(THD *thd, TABLE_LIST *tables, COND *cond)
&thd->col_access, NULL, 0, 1) || &thd->col_access, NULL, 0, 1) ||
(!thd->col_access && check_grant_db(thd, db_name->str))) || (!thd->col_access && check_grant_db(thd, db_name->str))) ||
sctx->master_access & (DB_ACLS | SHOW_DB_ACL) || sctx->master_access & (DB_ACLS | SHOW_DB_ACL) ||
acl_get(sctx->host, sctx->ip, sctx->priv_user, db_name->str, 0)) acl_get(sctx->get_host()->ptr(), sctx->get_ip()->ptr(),
sctx->priv_user, db_name->str, 0))
#endif #endif
{ {
List<LEX_STRING> table_names; List<LEX_STRING> table_names;
@ -3917,7 +3919,8 @@ int fill_schema_schemata(THD *thd, TABLE_LIST *tables, COND *cond)
} }
#ifndef NO_EMBEDDED_ACCESS_CHECKS #ifndef NO_EMBEDDED_ACCESS_CHECKS
if (sctx->master_access & (DB_ACLS | SHOW_DB_ACL) || if (sctx->master_access & (DB_ACLS | SHOW_DB_ACL) ||
acl_get(sctx->host, sctx->ip, sctx->priv_user, db_name->str, 0) || acl_get(sctx->get_host()->ptr(), sctx->get_ip()->ptr(),
sctx->priv_user, db_name->str, 0) ||
!check_grant_db(thd, db_name->str)) !check_grant_db(thd, db_name->str))
#endif #endif
{ {