Commit feb560c4 authored by unknown's avatar unknown

Bug#24988 FLUSH PRIVILEGES causes brief unavailability

- A race condition caused brief unavailablility when trying to acccess
  a table.
- The unprotected variable 'grant_option' wasn't intended to alternate
  during normal execution. Variable initialization moved to grant_init
  a lines responsible for the alternation are removed. 


sql/mysqld.cc:
  - Added documentation to describe grant_option flag.
sql/sql_acl.cc:
  - This patch removes lines which causes grant_option to alternate and moves
    variable initialization to the grant_init()-function.
parent 78313724
...@@ -346,7 +346,15 @@ bool opt_endinfo, using_udf_functions; ...@@ -346,7 +346,15 @@ bool opt_endinfo, using_udf_functions;
my_bool locked_in_memory; my_bool locked_in_memory;
bool opt_using_transactions, using_update_log; bool opt_using_transactions, using_update_log;
bool volatile abort_loop; bool volatile abort_loop;
bool volatile shutdown_in_progress, grant_option; bool volatile shutdown_in_progress;
/**
@brief 'grant_option' is used to indicate if privileges needs
to be checked, in which case the lock, LOCK_grant, is used
to protect access to the grant table.
@note This flag is dropped in 5.1
@see grant_init()
*/
bool volatile grant_option;
my_bool opt_skip_slave_start = 0; // If set, slave is not autostarted my_bool opt_skip_slave_start = 0; // If set, slave is not autostarted
my_bool opt_reckless_slave = 0; my_bool opt_reckless_slave = 0;
......
...@@ -2995,7 +2995,7 @@ bool mysql_table_grant(THD *thd, TABLE_LIST *table_list, ...@@ -2995,7 +2995,7 @@ bool mysql_table_grant(THD *thd, TABLE_LIST *table_list,
} }
} }
} }
grant_option=TRUE;
thd->mem_root= old_root; thd->mem_root= old_root;
pthread_mutex_unlock(&acl_cache->lock); pthread_mutex_unlock(&acl_cache->lock);
...@@ -3162,7 +3162,7 @@ bool mysql_routine_grant(THD *thd, TABLE_LIST *table_list, bool is_proc, ...@@ -3162,7 +3162,7 @@ bool mysql_routine_grant(THD *thd, TABLE_LIST *table_list, bool is_proc,
continue; continue;
} }
} }
grant_option=TRUE;
thd->mem_root= old_root; thd->mem_root= old_root;
pthread_mutex_unlock(&acl_cache->lock); pthread_mutex_unlock(&acl_cache->lock);
if (!result && !no_error) if (!result && !no_error)
...@@ -3338,6 +3338,8 @@ my_bool grant_init() ...@@ -3338,6 +3338,8 @@ my_bool grant_init()
delete thd; delete thd;
/* Remember that we don't have a THD */ /* Remember that we don't have a THD */
my_pthread_setspecific_ptr(THR_THD, 0); my_pthread_setspecific_ptr(THR_THD, 0);
/* Set the grant option flag so we will check grants */
grant_option= TRUE;
DBUG_RETURN(return_val); DBUG_RETURN(return_val);
} }
...@@ -3367,7 +3369,6 @@ static my_bool grant_load(TABLE_LIST *tables) ...@@ -3367,7 +3369,6 @@ static my_bool grant_load(TABLE_LIST *tables)
THR_MALLOC); THR_MALLOC);
DBUG_ENTER("grant_load"); DBUG_ENTER("grant_load");
grant_option = FALSE;
(void) hash_init(&column_priv_hash,system_charset_info, (void) hash_init(&column_priv_hash,system_charset_info,
0,0,0, (hash_get_key) get_grant_table, 0,0,0, (hash_get_key) get_grant_table,
(hash_free_key) free_grant_table,0); (hash_free_key) free_grant_table,0);
...@@ -3478,7 +3479,6 @@ static my_bool grant_load(TABLE_LIST *tables) ...@@ -3478,7 +3479,6 @@ static my_bool grant_load(TABLE_LIST *tables)
} }
while (!p_table->file->index_next(p_table->record[0])); while (!p_table->file->index_next(p_table->record[0]));
} }
grant_option= TRUE;
return_val=0; // Return ok return_val=0; // Return ok
end_unlock: end_unlock:
...@@ -3511,7 +3511,6 @@ my_bool grant_reload(THD *thd) ...@@ -3511,7 +3511,6 @@ my_bool grant_reload(THD *thd)
{ {
TABLE_LIST tables[3]; TABLE_LIST tables[3];
HASH old_column_priv_hash, old_proc_priv_hash, old_func_priv_hash; HASH old_column_priv_hash, old_proc_priv_hash, old_func_priv_hash;
bool old_grant_option;
MEM_ROOT old_mem; MEM_ROOT old_mem;
my_bool return_val= 1; my_bool return_val= 1;
DBUG_ENTER("grant_reload"); DBUG_ENTER("grant_reload");
...@@ -3541,7 +3540,6 @@ my_bool grant_reload(THD *thd) ...@@ -3541,7 +3540,6 @@ my_bool grant_reload(THD *thd)
old_column_priv_hash= column_priv_hash; old_column_priv_hash= column_priv_hash;
old_proc_priv_hash= proc_priv_hash; old_proc_priv_hash= proc_priv_hash;
old_func_priv_hash= func_priv_hash; old_func_priv_hash= func_priv_hash;
old_grant_option= grant_option;
old_mem= memex; old_mem= memex;
if ((return_val= grant_load(tables))) if ((return_val= grant_load(tables)))
...@@ -3551,7 +3549,6 @@ my_bool grant_reload(THD *thd) ...@@ -3551,7 +3549,6 @@ my_bool grant_reload(THD *thd)
column_priv_hash= old_column_priv_hash; /* purecov: deadcode */ column_priv_hash= old_column_priv_hash; /* purecov: deadcode */
proc_priv_hash= old_proc_priv_hash; proc_priv_hash= old_proc_priv_hash;
func_priv_hash= old_func_priv_hash; func_priv_hash= old_func_priv_hash;
grant_option= old_grant_option; /* purecov: deadcode */
memex= old_mem; /* purecov: deadcode */ memex= old_mem; /* purecov: deadcode */
} }
else else
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment