Bug #33345 loading example handler from command line kills server
Submitted: 18 Dec 2007 21:33 Modified: 7 Apr 19:25
Reporter: Oleksandr Byelkin
Status: Closed
Category:Server Severity:S2 (Serious)
Version:5.1 OS:Any
Assigned to: Oleksandr Byelkin Target Version:5.1
Tags: plugin
Triage: D1 (Critical)

[18 Dec 2007 21:33] Oleksandr Byelkin
Description:
Try to load example plugin from command line and with debug assertion.

mysqld: sql_plugin.cc:556: st_plugin_int* plugin_find_internal(const LEX_STRING*, int):
Assertion `(&LOCK_plugin)->count > 0 && pthread_equal(pthread_self(),
(&LOCK_plugin)->thread)' failed.

How to repeat:
1. build 5.1 debug (for example in /home/bell/mysql/bk/work-variable-5.1/)
2. cd mysql-test
3. ./mysql-test-run plugin
3. /home/bell/mysql/bk/work-variable-5.1/sql/mysqld --no-defaults --skip-grant-tables
--basedir=/home/bell/mysql/bk/work-variable-5.1/mysql-test
--datadir=/home/bell/mysql/bk/work-variable-5.1/mysql-test/var/master-data
--loose-skip-innodb --loose-skip-ndbcluster --tmpdir=. --core-file
--language=/home/bell/mysql/bk/work-variable-5.1/sql/share/english
--character-sets-dir=/home/bell/mysql/bk/work-variable-5.1/sql/share/charsets
--plugin_dir=/home/bell/mysql/bk/work-variable-5.1/storage/example/.libs/
--plugin_load=ha_example.so
[19 Dec 2007 7:07] Oleksandr Byelkin
This patch fixes the problem:
===== sql/sql_plugin.cc 1.78 vs edited =====
--- 1.78/sql/sql_plugin.cc      2007-12-13 13:49:55 +02:00
+++ edited/sql/sql_plugin.cc    2007-12-19 08:02:27 +02:00
@@ -1422,6 +1422,7 @@
 #endif
     case ';':
       name.str[name.length]= '\0';
+      pthread_mutex_lock(&LOCK_plugin);
       if (str != &dl)  // load all plugins in named module
       {
         dl= name;
@@ -1445,6 +1446,7 @@
         if (plugin_add(tmp_root, &name, &dl, argc, argv, REPORT_TO_LOG))
           goto error;
       }
+      pthread_mutex_unlock(&LOCK_plugin);
       name.length= dl.length= 0;
       dl.str= NULL; name.str= p= buffer;
       str= &name;
@@ -1464,6 +1466,7 @@
   }
   DBUG_RETURN(FALSE);
 error:
+  pthread_mutex_unlock(&LOCK_plugin);
   sql_print_error("Couldn't load plugin named '%s' with soname '%s'.",
                   name.str, dl.str);
   DBUG_RETURN(TRUE);
[19 Dec 2007 9:13] Bugs System
A patch for this bug has been committed. After review, it may
be pushed to the relevant source trees for release in the next
version. You can access the patch from:

  http://lists.mysql.com/commits/40177

ChangeSet@1.2680, 2007-12-19 10:13:13+02:00, bell@desktop.sanja.is.com.ua +1 -0
  Mutex protection added for loading plugins. (BUG#33345)
[29 Mar 17:11] Bugs System
Pushed into 5.1.24-rc
[1 Apr 21:09] Paul DuBois
Noted in 5.1.24 changelog.

Loading plugins via command-line options to mysqld could cause an
assertion failure. 

Resetting report to Patch queued waiting for push into 6.0.x.
[3 Apr 15:01] Bugs System
Pushed into 6.0.5-alpha
[7 Apr 19:25] Paul DuBois
Noted in 6.0.5 changelog.