summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergei Golubchik <sergii@pisem.net>2013-01-09 17:29:51 +0100
committerSergei Golubchik <sergii@pisem.net>2013-01-09 17:29:51 +0100
commitc9ff25f568df9112cb581348e865c79d8d663b4a (patch)
tree3bb9cebe9c7df365eb22208692dd3d892c6c481c
parenta128c50ac1b0d93f804aee98066588183c347607 (diff)
downloadmariadb-git-c9ff25f568df9112cb581348e865c79d8d663b4a.tar.gz
MDEV-3985 crash: uninstall soname 'a'
-rw-r--r--mysql-test/r/plugin.result2
-rw-r--r--mysql-test/t/plugin.test18
-rw-r--r--sql/sql_plugin.cc18
3 files changed, 27 insertions, 11 deletions
diff --git a/mysql-test/r/plugin.result b/mysql-test/r/plugin.result
index b5addf16147..6d8efe2615b 100644
--- a/mysql-test/r/plugin.result
+++ b/mysql-test/r/plugin.result
@@ -69,6 +69,8 @@ UNINSTALL PLUGIN EXAMPLE;
ERROR 42000: PLUGIN EXAMPLE does not exist
UNINSTALL PLUGIN non_exist;
ERROR 42000: PLUGIN non_exist does not exist
+UNINSTALL SONAME 'non_exist';
+ERROR 42000: SONAME non_exist.so does not exist
#
# Bug#32034: check_func_enum() does not check correct values but set it
# to impossible int val
diff --git a/mysql-test/t/plugin.test b/mysql-test/t/plugin.test
index 2b234b64047..4412383f837 100644
--- a/mysql-test/t/plugin.test
+++ b/mysql-test/t/plugin.test
@@ -4,14 +4,14 @@
CREATE TABLE t1(a int) ENGINE=EXAMPLE;
DROP TABLE t1;
-eval INSTALL PLUGIN example SONAME 'ha_example';
+INSTALL PLUGIN example SONAME 'ha_example';
--replace_regex /\.dll/.so/
--error 1125
-eval INSTALL PLUGIN EXAMPLE SONAME 'ha_example';
+INSTALL PLUGIN EXAMPLE SONAME 'ha_example';
UNINSTALL PLUGIN example;
-eval INSTALL SONAME 'ha_example';
+INSTALL SONAME 'ha_example';
--replace_column 5 #
--replace_regex /\.dll/.so/
--query_vertical select * from information_schema.plugins where plugin_library like 'ha_example%'
@@ -28,7 +28,7 @@ set global example_enum_var= e1;
show status like 'example%';
show variables like 'example%';
-eval UNINSTALL SONAME 'ha_example';
+UNINSTALL SONAME 'ha_example';
--replace_column 5 #
--replace_regex /\.dll/.so/
--query_vertical select * from information_schema.plugins where plugin_library like 'ha_example%'
@@ -41,12 +41,18 @@ UNINSTALL PLUGIN EXAMPLE;
--error 1305
UNINSTALL PLUGIN non_exist;
+#
+# MDEV-3985 crash: uninstall soname 'a'
+#
+--replace_regex /\.dll/.so/
+--error 1305
+UNINSTALL SONAME 'non_exist';
--echo #
--echo # Bug#32034: check_func_enum() does not check correct values but set it
--echo # to impossible int val
--echo #
-eval INSTALL PLUGIN example SONAME 'ha_example';
+INSTALL PLUGIN example SONAME 'ha_example';
SET GLOBAL example_enum_var= e1;
SET GLOBAL example_enum_var= e2;
@@ -60,7 +66,7 @@ UNINSTALL PLUGIN example;
#
# Bug #32757 hang with sql_mode set when setting some global variables
#
-eval INSTALL PLUGIN example SONAME 'ha_example';
+INSTALL PLUGIN example SONAME 'ha_example';
select @@session.sql_mode into @old_sql_mode;
diff --git a/sql/sql_plugin.cc b/sql/sql_plugin.cc
index dee48a28037..3d529c7a332 100644
--- a/sql/sql_plugin.cc
+++ b/sql/sql_plugin.cc
@@ -1,6 +1,6 @@
/*
Copyright (c) 2005, 2012, Oracle and/or its affiliates.
- Copyright (c) 2010, 2011, Monty Program Ab
+ Copyright (c) 2010, 2013, Monty Program Ab
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
@@ -2260,11 +2260,19 @@ bool mysql_uninstall_plugin(THD *thd, const LEX_STRING *name,
{
fix_dl_name(thd->mem_root, &dl);
st_plugin_dl *plugin_dl= plugin_dl_find(&dl);
- struct st_maria_plugin *plugin;
- for (plugin= plugin_dl->plugins; plugin->info; plugin++)
+ if (plugin_dl)
{
- LEX_STRING str= { const_cast<char*>(plugin->name), strlen(plugin->name) };
- error|= do_uninstall(thd, table, &str);
+ for (struct st_maria_plugin *plugin= plugin_dl->plugins;
+ plugin->info; plugin++)
+ {
+ LEX_STRING str= { const_cast<char*>(plugin->name), strlen(plugin->name) };
+ error|= do_uninstall(thd, table, &str);
+ }
+ }
+ else
+ {
+ my_error(ER_SP_DOES_NOT_EXIST, MYF(0), "SONAME", dl.str);
+ error= true;
}
}
reap_plugins();