Description:
If an engine fails to initialize (during INSTALL PLUGIN or server startup), further accesses to MyISAM tables (including grant tables) may result in server crash.
This is affecting all engines with init() function that may return non-zero status on error. At least InnoDB, NDB and Falcon are pretty affected. Third party engines may be affected as well.
Though it was discovered while fixing pure Falcon BUG#42275, it is also affecting mysql-5.1.
Both risk and effort to fix are low.
The problem seem to be around handlerton to plugin mapping. Handlerton slot in hton2plugin mapping is calculated after plugin init() function gets called. If init() function fails, handlerton slot left untouched and holding 0 value (which is usually MyISAM slot).
Later, when we call deinit() function, we're actually shutting down MyISAM and setting it's slot to NULL.
How to repeat:
Trigger an engine init() function to return non-zero status. The easiest way to repeat this is to modify some trivial storage engine to always return non-zero.
E.g. always return 1 from blackhole_init() in ha_blackhole.cc and start the server (if an engine is compiled-in or installed) or issue INSTALL PLUGIN statement.
Suggested fix:
This probably may be fixed by the following patch:
=== modified file 'sql/handler.cc'
--- sql/handler.cc 2008-12-10 20:14:50 +0000
+++ sql/handler.cc 2009-01-26 10:22:51 +0000
@@ -433,6 +433,8 @@
{
if (plugin->plugin->init(hton))
{
+ my_free((uchar*) hton, MYF(0));
+ plugin->data= NULL;
sql_print_error("Plugin '%s' init function returned error.",
plugin->name.str);
goto err;