summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorunknown <msvensson@neptunus.(none)>2006-04-18 10:55:57 +0200
committerunknown <msvensson@neptunus.(none)>2006-04-18 10:55:57 +0200
commit5c1b70beb8a0dd93d0ffb0ef1944a93ec7a92e10 (patch)
tree8e7d983bef3a7f0f2eaa63cceb22c2e46534a010
parentbf8f30b532ef217dac2a168124706d28e19a320f (diff)
parent3bcbf91376ff05ee9da1736c98998356c3bcbc56 (diff)
downloadmariadb-git-5c1b70beb8a0dd93d0ffb0ef1944a93ec7a92e10.tar.gz
Merge 192.168.0.20:mysql/bug13310/my50-bug13310
into neptunus.(none):/home/msvensson/mysql/mysql-5.0 sql/sql_parse.cc: Auto merged
-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 38eadb5a738..1321342c210 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -992,6 +992,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
@@ -1017,11 +1018,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))))