summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <msvensson@shellback.(none)>2006-04-18 10:46:17 +0200
committerunknown <msvensson@shellback.(none)>2006-04-18 10:46:17 +0200
commit3bcbf91376ff05ee9da1736c98998356c3bcbc56 (patch)
treeb5c897a1916d22ac7c068c451037aa4300b77c41
parentd33fc7bad1a7e019434692d5244f6477373771f3 (diff)
downloadmariadb-git-3bcbf91376ff05ee9da1736c98998356c3bcbc56.tar.gz
BUG#13310 incorrect user parsing by SP
- Strip surrounding ''s from username when a new user connects. There is no user 'a@', it should be a@ mysql-test/r/grant2.result: Update test result mysql-test/t/grant2.test: Add tests for bug 13310 sql/sql_parse.cc: Strip surrounding ''s from username when a new user connects. There is no user 'a@', it should be a@
-rw-r--r--mysql-test/r/grant2.result13
-rw-r--r--mysql-test/t/grant2.test25
-rw-r--r--sql/sql_parse.cc15
3 files changed, 50 insertions, 3 deletions
diff --git a/mysql-test/r/grant2.result b/mysql-test/r/grant2.result
index a42ad0d79a5..fa25df3203f 100644
--- a/mysql-test/r/grant2.result
+++ b/mysql-test/r/grant2.result
@@ -356,3 +356,16 @@ insert into mysql.user select * from t1;
drop table t1, t2;
drop database TESTDB;
flush privileges;
+grant all privileges on test.* to `a@`@localhost;
+grant execute on * to `a@`@localhost;
+create table t2 (s1 int);
+insert into t2 values (1);
+drop function if exists f2;
+create function f2 () returns int begin declare v int; select s1 from t2
+into v; return v; end//
+select f2();
+f2()
+1
+drop function f2;
+drop table t2;
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM `a@`@localhost;
diff --git a/mysql-test/t/grant2.test b/mysql-test/t/grant2.test
index 2c62d2f1bd3..32232360afa 100644
--- a/mysql-test/t/grant2.test
+++ b/mysql-test/t/grant2.test
@@ -465,3 +465,28 @@ drop table t1, t2;
drop database TESTDB;
flush privileges;
+#
+# BUG#13310 incorrect user parsing by SP
+#
+
+grant all privileges on test.* to `a@`@localhost;
+grant execute on * to `a@`@localhost;
+connect (bug13310,localhost,'a@',,test);
+connection bug13310;
+create table t2 (s1 int);
+insert into t2 values (1);
+--disable_warnings
+drop function if exists f2;
+--enable_warnings
+delimiter //;
+create function f2 () returns int begin declare v int; select s1 from t2
+into v; return v; end//
+delimiter ;//
+select f2();
+
+drop function f2;
+drop table t2;
+disconnect bug13310;
+
+connection default;
+REVOKE ALL PRIVILEGES, GRANT OPTION FROM `a@`@localhost;
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index d9f5499f362..e163a7a1093 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -993,6 +993,7 @@ static int check_connection(THD *thd)
char *user= end;
char *passwd= strend(user)+1;
+ uint user_len= passwd - user - 1;
char *db= passwd;
char db_buff[NAME_LEN+1]; // buffer to store db in utf8
char user_buff[USERNAME_LENGTH+1]; // buffer to store user in utf8
@@ -1018,11 +1019,19 @@ static int check_connection(THD *thd)
db= db_buff;
}
- user_buff[copy_and_convert(user_buff, sizeof(user_buff)-1,
- system_charset_info, user, strlen(user),
- thd->charset(), &dummy_errors)]= '\0';
+ user_buff[user_len= copy_and_convert(user_buff, sizeof(user_buff)-1,
+ system_charset_info, user, user_len,
+ thd->charset(), &dummy_errors)]= '\0';
user= user_buff;
+ /* If username starts and ends in "'", chop them off */
+ if (user_len > 1 && user[0] == '\'' && user[user_len - 1] == '\'')
+ {
+ user[user_len-1]= 0;
+ user++;
+ user_len-= 2;
+ }
+
if (thd->main_security_ctx.user)
x_free(thd->main_security_ctx.user);
if (!(thd->main_security_ctx.user= my_strdup(user, MYF(0))))