| Bug #44798 | MySQL engine crashes when creating stored procedures with execute_priv=N | ||
|---|---|---|---|
| Submitted: | 11 May 2009 17:47 | Modified: | 3 Aug 2009 23:16 |
| Reporter: | Andrew Shoemaker | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: Stored Routines | Severity: | S2 (Serious) |
| Version: | 5.0.77-5.0.81, 5.0, 5.1, 6.0 bzr | OS: | Linux (2.6 64bit) |
| Assigned to: | Sergei Glukhov | CPU Architecture: | Any |
| Tags: | crash, create procedure, execute_priv | ||
[11 May 2009 23:43]
MySQL Verification Team
See bug: http://bugs.mysql.com/bug.php?id=44805.
[12 May 2009 8:42]
Sveta Smirnova
Thank you for the report.
Verified as described.
Backtrace from version 5.1:
Thread 1 (process 9601):
#0 0x002ce402 in __kernel_vsyscall ()
#1 0x0046264f in pthread_kill () from /lib/libpthread.so.0
#2 0x085a7579 in my_write_core (sig=11) at stacktrace.c:310
#3 0x0824d392 in handle_segfault (sig=11) at mysqld.cc:2536
#4 <signal handler called>
#5 0x0858c00b in strdup_root (root=0x88799c0, str=0xa5a5a5a5 <Address 0xa5a5a5a5 out of bounds>) at my_alloc.c:398
#6 0x08326efd in acl_insert_user (user=0x8df52c0 "foobar", host=0x8df52b0 "localhost", password=0x86e358a "", password_len=0, ssl_type=SSL_TYPE_NOT_SPECIFIED,
ssl_cipher=0xa5a5a5a5 <Address 0xa5a5a5a5 out of bounds>, x509_issuer=0xa5a5a5a5 <Address 0xa5a5a5a5 out of bounds>, x509_subject=0xa5a5a5a5 <Address 0xa5a5a5a5 out of bounds>, mqh=0x8df4fc0,
privileges=0) at sql_acl.cc:1245
#7 0x0832bc93 in replace_user_table (thd=0x8df37a0, table=0x8dc9020, combo=@0x8df5298, rights=0, revoke_grant=false, can_create_user=true, no_auto_create=false) at sql_acl.cc:2102
#8 0x08330f60 in mysql_routine_grant (thd=0x8df37a0, table_list=0xb73ac1b4, is_proc=true, user_list=@0xb73ac3c8, rights=17039360, revoke_grant=false, no_error=true) at sql_acl.cc:3303
#9 0x08337f0e in sp_grant_privileges (thd=0x8df37a0, sp_db=0x8e28620 "test", sp_name=0x8e28628 "foo1", is_proc=true) at sql_acl.cc:6245
#10 0x082695d2 in mysql_execute_command (thd=0x8df37a0) at sql_parse.cc:4227
#11 0x0826c258 in mysql_parse (thd=0x8df37a0, inBuf=0x8df5178 "CREATE PROCEDURE `foo1`(input_number INT) BEGIN END", length=51, found_semicolon=0xb73ad2fc) at sql_parse.cc:5929
#12 0x0826ce94 in dispatch_command (command=COM_QUERY, thd=0x8df37a0, packet=0x8e24301 "CREATE PROCEDURE `foo1`(input_number INT) BEGIN END", packet_length=51) at sql_parse.cc:1216
#13 0x0826e0b2 in do_command (thd=0x8df37a0) at sql_parse.cc:857
#14 0x0825a831 in handle_one_connection (arg=0x8df37a0) at sql_connect.cc:1115
#15 0x0045fbd4 in start_thread () from /lib/libpthread.so.0
#16 0x003b74fe in clone () from /lib/libc.so.6
[12 May 2009 8:43]
Sveta Smirnova
test case
Attachment: bug44798.test (application/octet-stream, text), 918 bytes.
[12 May 2009 10:37]
Sveta Smirnova
Bug #44805 was marked as duplicate of this one.
[2 Jun 2009 8:24]
Kristofer Pettersson
The privilege part is partly initialized by this bison rule:
clear_privileges:
/* Nothing */
{
LEX *lex=Lex;
lex->users_list.empty();
lex->columns.empty();
lex->grant= lex->grant_tot_col= 0;
lex->all_privileges= 0;
lex->select_lex.db= 0;
lex->ssl_type= SSL_TYPE_NOT_SPECIFIED;
lex->ssl_cipher= lex->x509_subject= lex->x509_issuer= 0;
bzero((char *)&(lex->mqh),sizeof(lex->mqh));
}
;
I can be found in rules like:
grant:
GRANT clear_privileges grant_command
{}
;
However, the CREATE PROCEDURE rule has no 'clear_privileges' and the cipher variables remains uninitialized.
One solution might be to add the clear_privileges sub rule, another might be to make the cipher initialization part of the lex constructor.
Just adding
lex->ssl_type= SSL_TYPE_NOT_SPECIFIED;
lex->ssl_cipher= lex->x509_subject= lex->x509_issuer= 0;
before the call to mysql_routine_grant also solved the crash.
[2 Jun 2009 10:45]
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/75451 2764 Sergey Glukhov 2009-06-02 Bug#44798 MySQL engine crashes when creating stored procedures with execute_priv=N The crash happens because of uninitialized lex->ssl_cipher, lex->x509_subject, lex->x509_issuer variables. The fix is to add initialization of these variables for stored procedures&functions. @ mysql-test/r/sp_notembedded.result test result @ mysql-test/t/sp_notembedded.test test case @ sql/sql_acl.cc The crash happens because of uninitialized lex->ssl_cipher, lex->x509_subject, lex->x509_issuer variables. The fix is to add initialization of these variables for stored procedures&functions.
[3 Jun 2009 7:37]
Kristofer Pettersson
Patch meets the minimal-patch-to-fix-the-problem criteria and as such it is approved. I'd like to see a refactoring of the overall design of st_lex variables initialization but as Sergey Gluhov points out it might be out of the scope of a common bug fix.
[3 Jun 2009 13:20]
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/75526 3341 Sergey Glukhov 2009-06-03 Bug#44798 MySQL engine crashes when creating stored procedures with execute_priv=N(for 6.0 only) The crash happens because of uninitialized lex->ssl_cipher, lex->x509_subject, lex->x509_issuer variables. The fix is to move initialization code for grant related variables into lex_start() and get rid of the 'clear_privileges' rule in sql_yacc.yy. @ mysql-test/r/sp_notembedded.result test result @ mysql-test/t/sp_notembedded.test test case @ sql/sql_acl.cc removed initialization code for grant related variables @ sql/sql_lex.cc added initialization code for grant related variables @ sql/sql_yacc.yy removed 'clear_privileges' rule
[4 Jun 2009 6:29]
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/75579 2764 Sergey Glukhov 2009-06-04 Bug#44798 MySQL engine crashes when creating stored procedures with execute_priv=N The crash happens because of uninitialized lex->ssl_cipher, lex->x509_subject, lex->x509_issuer variables. The fix is to add initialization of these variables for stored procedures&functions. @ mysql-test/r/sp_notembedded.result test result @ mysql-test/t/sp_notembedded.test test case @ sql/sql_acl.cc The crash happens because of uninitialized lex->ssl_cipher, lex->x509_subject, lex->x509_issuer variables. The fix is to add initialization of these variables for stored procedures&functions.
[4 Jun 2009 7:29]
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/75582 3341 Sergey Glukhov 2009-06-04 [merge] Bug#44798 MySQL engine crashes when creating stored procedures with execute_priv=N(for 6.0 only) The crash happens because of uninitialized lex->ssl_cipher, lex->x509_subject, lex->x509_issuer variables. The fix is to move initialization code for grant related variables into lex_start() and get rid of the 'clear_privileges' rule in sql_yacc.yy. @ mysql-test/r/sp_notembedded.result test result @ mysql-test/t/sp_notembedded.test test case @ sql/sql_acl.cc removed initialization code for grant related variables @ sql/sql_lex.cc added initialization code for grant related variables @ sql/sql_yacc.yy removed 'clear_privileges' rule
[16 Jun 2009 8:31]
Bugs System
Pushed into 5.0.84 (revid:gkodinov@mysql.com-20090616082753-kwe0l8uoictxhojf) (version source revid:sergey.glukhov@sun.com-20090604052845-846iabwsi4vml458) (merge vers: 5.0.83) (pib:6)
[16 Jun 2009 11:02]
Bugs System
Pushed into 5.1.36 (revid:joro@sun.com-20090616102155-3zhezogudt4uxdyn) (version source revid:sergey.glukhov@sun.com-20090604055423-tf3xc0wnkey5jbbk) (merge vers: 5.1.36) (pib:6)
[17 Jun 2009 19:24]
Bugs System
Pushed into 5.4.4-alpha (revid:alik@sun.com-20090616183122-chjzbaa30qopdra9) (version source revid:sergey.glukhov@sun.com-20090604062744-m6bfj8f0o3vqyfze) (merge vers: 6.0.12-alpha) (pib:11)
[3 Aug 2009 23:16]
Paul DuBois
Note in 5.0.84, 5.1.36, 5.4.4 changelogs. The server crashed in an account with the CREATE ROUTINE privilege but not the EXECUTE privilege created a stored procedure.
[26 Aug 2009 13:46]
Bugs System
Pushed into 5.1.37-ndb-7.0.8 (revid:jonas@mysql.com-20090826132541-yablppc59e3yb54l) (version source revid:jonas@mysql.com-20090826132541-yablppc59e3yb54l) (merge vers: 5.1.37-ndb-7.0.8) (pib:11)
[26 Aug 2009 13:46]
Bugs System
Pushed into 5.1.37-ndb-6.3.27 (revid:jonas@mysql.com-20090826105955-bkj027t47gfbamnc) (version source revid:jonas@mysql.com-20090826105955-bkj027t47gfbamnc) (merge vers: 5.1.37-ndb-6.3.27) (pib:11)
[26 Aug 2009 13:48]
Bugs System
Pushed into 5.1.37-ndb-6.2.19 (revid:jonas@mysql.com-20090825194404-37rtosk049t9koc4) (version source revid:jonas@mysql.com-20090825194404-37rtosk049t9koc4) (merge vers: 5.1.37-ndb-6.2.19) (pib:11)
[27 Aug 2009 16:32]
Bugs System
Pushed into 5.1.35-ndb-7.1.0 (revid:magnus.blaudd@sun.com-20090827163030-6o3kk6r2oua159hr) (version source revid:jonas@mysql.com-20090826132541-yablppc59e3yb54l) (merge vers: 5.1.37-ndb-7.0.8) (pib:11)
[11 Mar 2010 18:01]
Paul DuBois
Noted in 5.5.3 changelog.

Description: I experienced a repeatable issue using mysql 5.0.77 and 5.0.81 (community and percona-highperf). If an account is created with the ability to create stored procedures, but not execute them, then the mysql engine will crash. In all instances a new user account with the host and user of the offending client will be created with no privileges in the user account table. In some situations the mysql engine will also exit with a signal 11. I have a very large stack trace output from a debug version, so if you want that please contact me by email. How to repeat: - launch mysql 5.0.81 with a default my.cnf - create a user account with the following permissions Host: % User: foobar Password: *somecraphere Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y Create_priv: Y Drop_priv: Y Reload_priv: N Shutdown_priv: N Process_priv: N File_priv: N Grant_priv: N References_priv: N Index_priv: Y Alter_priv: Y Show_db_priv: N Super_priv: N Create_tmp_table_priv: Y Lock_tables_priv: Y Execute_priv: N Repl_slave_priv: N Repl_client_priv: N Create_view_priv: N Show_view_priv: N Create_routine_priv: Y Alter_routine_priv: Y Create_user_priv: N ssl_type: ssl_cipher: x509_issuer: x509_subject: max_questions: 0 max_updates: 0 max_connections: 0 max_user_connections: 0 Host: % Db: somedb User: foobar Select_priv: Y Insert_priv: Y Update_priv: Y Delete_priv: Y Create_priv: Y Drop_priv: Y Grant_priv: N References_priv: N Index_priv: Y Alter_priv: Y Create_tmp_table_priv: Y Lock_tables_priv: Y Create_view_priv: N Show_view_priv: N Create_routine_priv: Y Alter_routine_priv: Y Execute_priv: N - create database somedb - login as the "foobar" user using the mysql CLI - run following stored procedure CREATE PROCEDURE `foo1`(input_number INT) BEGIN END; - see if engine has crashed - look in mysql.user (using another window logged in as root user) and see if a new unprivileged account was created for localhost.foobar - if nothing happened then just repeat this a few thousand times. It will definitly happen without much effort. Suggested fix: Well it should probably give an error instead of crashing and creating the locked account.