| Bug #43830 | CREATE PROCEDURE causes ERROR 1410 unless ALTER ROUTINE is granted | ||
|---|---|---|---|
| Submitted: | 24 Mar 2009 12:06 | Modified: | 27 Mar 2009 7:29 |
| Reporter: | Dmitry Samborskiy | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | MySQL Server: Security: Privileges | Severity: | S3 (Non-critical) |
| Version: | 5.1.32, 5.0, 5.1, 6.0 bzr | OS: | Linux |
| Assigned to: | CPU Architecture: | Any | |
[24 Mar 2009 12:06]
Dmitry Samborskiy
[24 Mar 2009 21:02]
Sveta Smirnova
Thank you for the report. I can not repeat described behavior. Please provide output of SHOW GRANTS when you connect as user test first time and your configuration file.
[25 Mar 2009 11:43]
Dmitry Samborskiy
> Please provide output of SHOW GRANTS when you connect as user test
> first time and your configuration file.
See below. (Actually, I observed this behaviour on three hosts
with installed MySQL 5.1.30-community / 5.1.32-community under Fedora Core 6, 10 and CentOS 5.0.)
mysql> show grants for test;
+----------------------------------------------------------------------------+
| Grants for test@% |
+----------------------------------------------------------------------------+
| GRANT USAGE ON *.* TO 'test'@'%' IDENTIFIED BY PASSWORD '773359240eb9a1d9' |
| GRANT EXECUTE, CREATE ROUTINE ON `db1`.* TO 'test'@'%' |
+----------------------------------------------------------------------------+
2 rows in set (0.00 sec)
$ cat /etc/my.cnf
[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
# Default to using old password format for compatibility with mysql 3.x
# clients (those using the mysqlclient10 compatibility package).
old_passwords=1
default_storage_engine=InnoDB
set-variable = max_allowed_packet=1024M
init_connect='SET collation_connection = utf8_general_ci'
init_connect='SET NAMES utf8'
default-character-set=utf8
character-set-server = utf8
collation-server = utf8_general_ci
[client]
default-character-set=utf8
[mysql.server]
user=mysql
#basedir=/var/lib
set-variable=long_query_time=1
log-slow-queries=/var/log/mysql/log-slow-queries.log
[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[27 Mar 2009 7:29]
Sveta Smirnova
Thank you for the feedback. Verified as described with versions 5.0 and 5.1.30. Since version 5.1 server crashes for me with following backtrace: Thread 1 (process 23820): #0 0x002ce402 in __kernel_vsyscall () #1 0x0046264f in pthread_kill () from /lib/libpthread.so.0 #2 0x085a46c5 in my_write_core (sig=6) at stacktrace.c:310 #3 0x0824c685 in handle_segfault (sig=6) at mysqld.cc:2513 #4 <signal handler called> #5 0x002ce402 in __kernel_vsyscall () #6 0x00314f90 in raise () from /lib/libc.so.6 #7 0x00316678 in abort () from /lib/libc.so.6 #8 0x0030e269 in __assert_fail () from /lib/libc.so.6 #9 0x08232a9d in Diagnostics_area::set_ok_status (this=0x8aa1f00, thd=0x8aa1150, affected_rows_arg=0, last_insert_id_arg=0, message_arg=0x0) at sql_class.cc:436 #10 0x08174de5 in my_ok (thd=0x8aa1150, affected_rows=0, id=0, message=0x0) at sql_class.h:2255 #11 0x082684d5 in mysql_execute_command (thd=0x8aa1150) at sql_parse.cc:4172 #12 0x0826af74 in mysql_parse (thd=0x8aa1150, inBuf=0x8ab34b0 "CREATE PROCEDURE p1 (OUT i INT) BEGIN SET i = 1; END", length=52, found_semicolon=0xb74222fc) at sql_parse.cc:5831 #13 0x0826bbb0 in dispatch_command (command=COM_QUERY, thd=0x8aa1150, packet=0x8aab451 "CREATE PROCEDURE p1 (OUT i INT) BEGIN SET i = 1; END", packet_length=52) at sql_parse.cc:1216 #14 0x0826cdce in do_command (thd=0x8aa1150) at sql_parse.cc:857 #15 0x08259a05 in handle_one_connection (arg=0x8aa1150) at sql_connect.cc:1115 #16 0x0045fbd4 in start_thread () from /lib/libpthread.so.0 #17 0x003b74fe in clone () from /lib/libc.so.6 Test case: create database if not exists db1; CREATE USER `test`; GRANT CREATE ROUTINE, EXECUTE ON `db1`.* TO 'test'@'%'; connect (addcontest, localhost, test,,); connection addcontest; show grants; use db1; delimiter |; CREATE PROCEDURE p1 (OUT i INT) BEGIN SET i = 1; END| CALL p1(@i)| SELECT @i| delimiter ;| connection default; GRANT ALTER ROUTINE ON `db1`.* TO 'test'@'%'; DROP PROCEDURE db1.p1; connection addcontest; delimiter |; CREATE PROCEDURE p1 (OUT i INT) BEGIN SET i = 1; END| CALL p1(@i)| SELECT @i|
