diff options
author | Staale Smedseng <staale.smedseng@sun.com> | 2010-04-16 15:02:23 +0200 |
---|---|---|
committer | Staale Smedseng <staale.smedseng@sun.com> | 2010-04-16 15:02:23 +0200 |
commit | 9743819d361bc4caff7db26041854b737f497d91 (patch) | |
tree | dcd09dc67b58f36762c0fbcfdd9538672508107d /sql/sql_plugin.cc | |
parent | 649deaa8a1ab7660322152156b862a27de78d327 (diff) | |
download | mariadb-git-9743819d361bc4caff7db26041854b737f497d91.tar.gz |
Bug#51591 deadlock in the plugins+status+variables
Potential deadlock situation involving LOCK_plugin,
LOCK_global_system_variables and LOCK_status.
This patch backports the fix from next-mr, unlocking
LOCK_plugin before calling plugin->init() and
add_status_vars().
Diffstat (limited to 'sql/sql_plugin.cc')
-rw-r--r-- | sql/sql_plugin.cc | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc index 0706ef24881..87c0adc3133 100644 --- a/sql/sql_plugin.cc +++ b/sql/sql_plugin.cc @@ -1006,9 +1006,14 @@ void plugin_unlock_list(THD *thd, plugin_ref *list, uint count) static int plugin_initialize(struct st_plugin_int *plugin) { + int ret= 1; DBUG_ENTER("plugin_initialize"); safe_mutex_assert_owner(&LOCK_plugin); + uint state= plugin->state; + DBUG_ASSERT(state == PLUGIN_IS_UNINITIALIZED); + + pthread_mutex_unlock(&LOCK_plugin); if (plugin_type_initialize[plugin->plugin->type]) { if ((*plugin_type_initialize[plugin->plugin->type])(plugin)) @@ -1027,8 +1032,7 @@ static int plugin_initialize(struct st_plugin_int *plugin) goto err; } } - - plugin->state= PLUGIN_IS_READY; + state= PLUGIN_IS_READY; // plugin->init() succeeded if (plugin->plugin->status_vars) { @@ -1047,7 +1051,8 @@ static int plugin_initialize(struct st_plugin_int *plugin) if (add_status_vars(array)) // add_status_vars makes a copy goto err; #else - add_status_vars(plugin->plugin->status_vars); // add_status_vars makes a copy + if (add_status_vars(plugin->plugin->status_vars)) + goto err; #endif /* FIX_LATER */ } @@ -1067,9 +1072,12 @@ static int plugin_initialize(struct st_plugin_int *plugin) } } - DBUG_RETURN(0); + ret= 0; + err: - DBUG_RETURN(1); + pthread_mutex_lock(&LOCK_plugin); + plugin->state= state; + DBUG_RETURN(ret); } |