mirror of
https://github.com/MariaDB/server.git
synced 2025-12-24 11:21:21 +03:00
merge
This commit is contained in:
@@ -516,6 +516,7 @@ check_connections(THD *thd)
|
||||
{
|
||||
vio_in_addr(net->vio,&thd->remote.sin_addr);
|
||||
thd->host=ip_to_hostname(&thd->remote.sin_addr,&connect_errors);
|
||||
thd->host[strnlen(thd->host, HOSTNAME_LENGTH)]= 0;
|
||||
if (connect_errors > max_connect_errors)
|
||||
return(ER_HOST_IS_BLOCKED);
|
||||
}
|
||||
@@ -532,6 +533,7 @@ check_connections(THD *thd)
|
||||
thd->ip=0;
|
||||
bzero((char*) &thd->remote,sizeof(struct sockaddr));
|
||||
}
|
||||
/* Ensure that wrong hostnames doesn't cause buffer overflows */
|
||||
vio_keepalive(net->vio, TRUE);
|
||||
|
||||
ulong pkt_len=0;
|
||||
@@ -763,7 +765,7 @@ pthread_handler_decl(handle_one_connection,arg)
|
||||
goto end_thread;
|
||||
}
|
||||
|
||||
if ((ulong) thd->variables.max_join_size == (ulonglong) HA_POS_ERROR)
|
||||
if (thd->variables.max_join_size == HA_POS_ERROR)
|
||||
thd->options |= OPTION_BIG_SELECTS;
|
||||
if (thd->client_capabilities & CLIENT_COMPRESS)
|
||||
net->compress=1; // Use compression
|
||||
@@ -839,7 +841,7 @@ extern "C" pthread_handler_decl(handle_bootstrap,arg)
|
||||
|
||||
#endif
|
||||
|
||||
if ((ulong) thd->variables.max_join_size == (ulonglong) HA_POS_ERROR)
|
||||
if (thd->variables.max_join_size == HA_POS_ERROR)
|
||||
thd->options |= OPTION_BIG_SELECTS;
|
||||
|
||||
thd->proc_info=0;
|
||||
@@ -969,6 +971,12 @@ bool do_command(THD *thd)
|
||||
vio_description(net->vio) ));
|
||||
return TRUE;
|
||||
}
|
||||
else if (!packet_length)
|
||||
{
|
||||
send_error(thd,net->last_errno,NullS);
|
||||
net->error=0;
|
||||
DBUG_RETURN(FALSE);
|
||||
}
|
||||
else
|
||||
{
|
||||
packet=(char*) net->read_pos;
|
||||
@@ -1254,6 +1262,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
||||
}
|
||||
if (lower_case_table_names)
|
||||
my_casedn_str(files_charset_info, db);
|
||||
if (check_access(thd,DROP_ACL,db,0,1))
|
||||
break;
|
||||
if (thd->locked_tables || thd->active_transaction())
|
||||
{
|
||||
send_error(thd,ER_LOCK_OR_ACTIVE_TRANSACTION);
|
||||
@@ -1294,10 +1304,8 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
||||
if (check_global_access(thd,RELOAD_ACL))
|
||||
break;
|
||||
mysql_log.write(thd,command,NullS);
|
||||
if (reload_acl_and_cache(thd, options, (TABLE_LIST*) 0))
|
||||
send_error(thd,0);
|
||||
else
|
||||
send_eof(thd);
|
||||
/* error sending is deferred to reload_acl_and_cache */
|
||||
reload_acl_and_cache(thd, options, (TABLE_LIST*) 0) ;
|
||||
break;
|
||||
}
|
||||
case COM_SHUTDOWN:
|
||||
@@ -1638,7 +1646,9 @@ mysql_execute_command(THD *thd)
|
||||
{
|
||||
res= mysqld_show_warnings(thd, (ulong)
|
||||
((1L << (uint) MYSQL_ERROR::WARN_LEVEL_NOTE) |
|
||||
(1L << (uint) MYSQL_ERROR::WARN_LEVEL_WARN)));
|
||||
(1L << (uint) MYSQL_ERROR::WARN_LEVEL_WARN) |
|
||||
(1L << (uint) MYSQL_ERROR::WARN_LEVEL_ERROR)
|
||||
));
|
||||
break;
|
||||
}
|
||||
case SQLCOM_SHOW_ERRORS:
|
||||
@@ -1880,6 +1890,24 @@ mysql_execute_command(THD *thd)
|
||||
break;
|
||||
}
|
||||
case SQLCOM_SLAVE_STOP:
|
||||
/*
|
||||
If the client thread has locked tables, a deadlock is possible.
|
||||
Assume that
|
||||
- the client thread does LOCK TABLE t READ.
|
||||
- then the master updates t.
|
||||
- then the SQL slave thread wants to update t,
|
||||
so it waits for the client thread because t is locked by it.
|
||||
- then the client thread does SLAVE STOP.
|
||||
SLAVE STOP waits for the SQL slave thread to terminate its
|
||||
update t, which waits for the client thread because t is locked by it.
|
||||
To prevent that, refuse SLAVE STOP if the
|
||||
client thread has locked tables
|
||||
*/
|
||||
if (thd->locked_tables || thd->active_transaction())
|
||||
{
|
||||
send_error(thd,ER_LOCK_OR_ACTIVE_TRANSACTION);
|
||||
break;
|
||||
}
|
||||
{
|
||||
LOCK_ACTIVE_MI;
|
||||
stop_slave(thd,active_mi,1/* net report*/);
|
||||
@@ -2287,12 +2315,17 @@ mysql_execute_command(THD *thd)
|
||||
}
|
||||
case SQLCOM_DROP_TABLE:
|
||||
{
|
||||
if (check_table_access(thd,DROP_ACL,tables))
|
||||
goto error; /* purecov: inspected */
|
||||
if (end_active_trans(thd))
|
||||
res= -1;
|
||||
else
|
||||
res = mysql_rm_table(thd,tables,lex->drop_if_exists);
|
||||
if (!lex->drop_temporary)
|
||||
{
|
||||
if (check_table_access(thd,DROP_ACL,tables))
|
||||
goto error; /* purecov: inspected */
|
||||
if (end_active_trans(thd))
|
||||
{
|
||||
res= -1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
res= mysql_rm_table(thd,tables,lex->drop_if_exists, lex->drop_temporary);
|
||||
}
|
||||
break;
|
||||
case SQLCOM_DROP_INDEX:
|
||||
@@ -2673,10 +2706,8 @@ mysql_execute_command(THD *thd)
|
||||
case SQLCOM_RESET:
|
||||
if (check_global_access(thd,RELOAD_ACL) || check_db_used(thd, tables))
|
||||
goto error;
|
||||
if (reload_acl_and_cache(thd, lex->type, tables))
|
||||
send_error(thd,0);
|
||||
else
|
||||
send_ok(thd);
|
||||
/* error sending is deferred to reload_acl_and_cache */
|
||||
reload_acl_and_cache(thd, lex->type, tables) ;
|
||||
break;
|
||||
case SQLCOM_KILL:
|
||||
kill_one_thread(thd,lex->thread_id);
|
||||
@@ -3690,10 +3721,15 @@ void add_join_natural(TABLE_LIST *a,TABLE_LIST *b)
|
||||
b->natural_join=a;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
Reload/resets privileges and the different caches
|
||||
*/
|
||||
|
||||
bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables)
|
||||
{
|
||||
bool result=0;
|
||||
|
||||
bool error_already_sent=0;
|
||||
select_errors=0; /* Write if more errors */
|
||||
if (options & REFRESH_GRANT)
|
||||
{
|
||||
@@ -3751,11 +3787,29 @@ bool reload_acl_and_cache(THD *thd, ulong options, TABLE_LIST *tables)
|
||||
{
|
||||
LOCK_ACTIVE_MI;
|
||||
if (reset_slave(thd, active_mi))
|
||||
{
|
||||
result=1;
|
||||
/*
|
||||
reset_slave() sends error itself.
|
||||
If it didn't, one would either change reset_slave()'s prototype, to
|
||||
pass *errorcode and *errmsg to it when it's called or
|
||||
change reset_slave to use my_error() to register the error.
|
||||
*/
|
||||
error_already_sent=1;
|
||||
}
|
||||
UNLOCK_ACTIVE_MI;
|
||||
}
|
||||
if (options & REFRESH_USER_RESOURCES)
|
||||
reset_mqh(thd,(LEX_USER *) NULL);
|
||||
|
||||
if (thd && !error_already_sent)
|
||||
{
|
||||
if (result)
|
||||
send_error(thd,0);
|
||||
else
|
||||
send_ok(thd);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user