diff options
author | Sergei Golubchik <sergii@pisem.net> | 2014-09-06 08:33:56 +0200 |
---|---|---|
committer | Sergei Golubchik <sergii@pisem.net> | 2014-09-06 08:33:56 +0200 |
commit | 3da761912a6b243b1361a27d5b796cc53dfff3ec (patch) | |
tree | c566c164d2499b28b18ffee1dc4f3c32f5c8a8bd /sql/sql_reload.cc | |
parent | 9392d0e280c622c56d1b533762d8b577ed5b82c6 (diff) | |
download | mariadb-git-3da761912a6b243b1361a27d5b796cc53dfff3ec.tar.gz |
MDEV-6616 Server crashes in my_hash_first if shutdown is performed when FLUSH LOGS is running
master_info_index becomes zero during shutdown.
check that it's valid (under a mutex) before dereferencing.
Diffstat (limited to 'sql/sql_reload.cc')
-rw-r--r-- | sql/sql_reload.cc | 57 |
1 files changed, 31 insertions, 26 deletions
diff --git a/sql/sql_reload.cc b/sql/sql_reload.cc index bb3d5bb899a..95e06ddbbd5 100644 --- a/sql/sql_reload.cc +++ b/sql/sql_reload.cc @@ -174,18 +174,21 @@ bool reload_acl_and_cache(THD *thd, unsigned long long options, */ tmp_write_to_binlog= 0; mysql_mutex_lock(&LOCK_active_mi); - if (!(mi= (master_info_index-> - get_master_info(&connection_name, - Sql_condition::WARN_LEVEL_ERROR)))) + if (master_info_index) { - result= 1; - } - else - { - mysql_mutex_lock(&mi->data_lock); - if (rotate_relay_log(mi)) - *write_to_binlog= -1; - mysql_mutex_unlock(&mi->data_lock); + if (!(mi= (master_info_index-> + get_master_info(&connection_name, + Sql_condition::WARN_LEVEL_ERROR)))) + { + result= 1; + } + else + { + mysql_mutex_lock(&mi->data_lock); + if (rotate_relay_log(mi)) + *write_to_binlog= -1; + mysql_mutex_unlock(&mi->data_lock); + } } mysql_mutex_unlock(&LOCK_active_mi); #endif @@ -346,22 +349,24 @@ bool reload_acl_and_cache(THD *thd, unsigned long long options, Master_info *mi; tmp_write_to_binlog= 0; mysql_mutex_lock(&LOCK_active_mi); - - if (!(mi= (master_info_index-> - get_master_info(&lex_mi->connection_name, - Sql_condition::WARN_LEVEL_ERROR)))) + if (master_info_index) { - result= 1; - } - else if (reset_slave(thd, mi)) - { - /* NOTE: my_error() has been already called by reset_slave(). */ - result= 1; - } - else if (mi->connection_name.length && thd->lex->reset_slave_info.all) - { - /* If not default connection and 'all' is used */ - master_info_index->remove_master_info(&mi->connection_name); + if (!(mi= (master_info_index-> + get_master_info(&lex_mi->connection_name, + Sql_condition::WARN_LEVEL_ERROR)))) + { + result= 1; + } + else if (reset_slave(thd, mi)) + { + /* NOTE: my_error() has been already called by reset_slave(). */ + result= 1; + } + else if (mi->connection_name.length && thd->lex->reset_slave_info.all) + { + /* If not default connection and 'all' is used */ + master_info_index->remove_master_info(&mi->connection_name); + } } mysql_mutex_unlock(&LOCK_active_mi); } |