Skip to content

Commit

Permalink
MDEV-6543 Crash if enable 'federatedx' when 'federated' plugin alread…
Browse files Browse the repository at this point in the history
…y enabled, and vice-versa

INSTALL SONAME ignores attempts to load the same plugin twice, it's not an error
(because one can load one plugin by name and then install soname for the rest).
But Federated and FederatedX are different plugins, despite having the same name.

Now plugin_add() only considers two plugins identical if their names are the same
string (compared as pointers). Otherwise it reports an error.,
  • Loading branch information
Sergei Golubchik committed Aug 6, 2014
1 parent 071a14c commit 75f0f17
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 2 deletions.
5 changes: 5 additions & 0 deletions mysql-test/suite/plugins/r/false_dupes-6543.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
install soname 'ha_federated';
install soname 'ha_federated';
install soname 'ha_federatedx';
ERROR HY000: Function 'FEDERATED' already exists
uninstall soname 'ha_federated';
18 changes: 18 additions & 0 deletions mysql-test/suite/plugins/t/false_dupes-6543.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#
# MDEV-6543 Crash if enable 'federatedx' when 'federated' plugin already enabled, and vice-versa
#
if(!$HA_FEDERATED_SO) {
skip Needs ha_federated.so;
}
if(!$HA_FEDERATEDX_SO) {
skip Needs ha_federatedx.so;
}

install soname 'ha_federated';
# note: no error below! install soname ignores already loaded plugins
install soname 'ha_federated';
# note: an error here, even though plugin name is the same!
--error ER_UDF_EXISTS
install soname 'ha_federatedx';
uninstall soname 'ha_federated';

10 changes: 8 additions & 2 deletions sql/sql_plugin.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1040,7 +1040,7 @@ static st_plugin_int *plugin_insert_or_reuse(struct st_plugin_int *plugin)
static bool plugin_add(MEM_ROOT *tmp_root,
const LEX_STRING *name, LEX_STRING *dl, int report)
{
struct st_plugin_int tmp;
struct st_plugin_int tmp, *maybe_dupe;
struct st_maria_plugin *plugin;
uint oks= 0, errs= 0, dupes= 0;
DBUG_ENTER("plugin_add");
Expand Down Expand Up @@ -1070,8 +1070,14 @@ static bool plugin_add(MEM_ROOT *tmp_root,
(const uchar *)tmp.name.str, tmp.name.length))
continue; // plugin name doesn't match

if (!name->str && plugin_find_internal(&tmp.name, MYSQL_ANY_PLUGIN))
if (!name->str &&
(maybe_dupe= plugin_find_internal(&tmp.name, MYSQL_ANY_PLUGIN)))
{
if (plugin->name != maybe_dupe->plugin->name)
{
report_error(report, ER_UDF_EXISTS, plugin->name);
DBUG_RETURN(TRUE);
}
dupes++;
continue; // already installed
}
Expand Down

0 comments on commit 75f0f17

Please sign in to comment.