Skip to content

Commit 0ed9d7e

Browse files
committed
Bug #48872 : Privileges for stored functions ignored if function name
is mixed case Transcode the procedure name to lowercase when searching for it in the hash. This is the missing part of the fix for bug #41049.
1 parent e2afa05 commit 0ed9d7e

File tree

3 files changed

+126
-5
lines changed

3 files changed

+126
-5
lines changed

mysql-test/r/sp-security.result

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,4 +519,65 @@ DROP USER mysqltest_u1@localhost;
519519
DROP PROCEDURE p_suid;
520520
DROP FUNCTION f_suid;
521521
DROP TABLE t1;
522+
#
523+
# Bug #48872 : Privileges for stored functions ignored if function name
524+
# is mixed case
525+
#
526+
CREATE DATABASE B48872;
527+
USE B48872;
528+
CREATE TABLE `TestTab` (id INT);
529+
INSERT INTO `TestTab` VALUES (1),(2);
530+
CREATE FUNCTION `f_Test`() RETURNS INT RETURN 123;
531+
CREATE FUNCTION `f_Test_denied`() RETURNS INT RETURN 123;
532+
CREATE USER 'tester';
533+
CREATE USER 'Tester';
534+
GRANT SELECT ON TABLE `TestTab` TO 'tester';
535+
GRANT EXECUTE ON FUNCTION `f_Test` TO 'tester';
536+
GRANT EXECUTE ON FUNCTION `f_Test_denied` TO 'Tester';
537+
SELECT f_Test();
538+
f_Test()
539+
123
540+
SELECT * FROM TestTab;
541+
id
542+
1
543+
2
544+
SELECT * FROM TestTab;
545+
id
546+
1
547+
2
548+
SELECT `f_Test`();
549+
`f_Test`()
550+
123
551+
SELECT `F_TEST`();
552+
`F_TEST`()
553+
123
554+
SELECT f_Test();
555+
f_Test()
556+
123
557+
SELECT F_TEST();
558+
F_TEST()
559+
123
560+
SELECT * FROM TestTab;
561+
ERROR 42000: SELECT command denied to user 'Tester'@'localhost' for table 'TestTab'
562+
SELECT `f_Test`();
563+
ERROR 42000: execute command denied to user 'Tester'@'%' for routine 'B48872.f_Test'
564+
SELECT `F_TEST`();
565+
ERROR 42000: execute command denied to user 'Tester'@'%' for routine 'B48872.f_Test'
566+
SELECT f_Test();
567+
ERROR 42000: execute command denied to user 'Tester'@'%' for routine 'B48872.f_Test'
568+
SELECT F_TEST();
569+
ERROR 42000: execute command denied to user 'Tester'@'%' for routine 'B48872.f_Test'
570+
SELECT `f_Test_denied`();
571+
`f_Test_denied`()
572+
123
573+
SELECT `F_TEST_DENIED`();
574+
`F_TEST_DENIED`()
575+
123
576+
DROP TABLE `TestTab`;
577+
DROP FUNCTION `f_Test`;
578+
DROP FUNCTION `f_Test_denied`;
579+
USE test;
580+
DROP USER 'tester';
581+
DROP USER 'Tester';
582+
DROP DATABASE B48872;
522583
End of 5.0 tests.

mysql-test/t/sp-security.test

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -889,6 +889,63 @@ DROP PROCEDURE p_suid;
889889
DROP FUNCTION f_suid;
890890
DROP TABLE t1;
891891

892+
--echo #
893+
--echo # Bug #48872 : Privileges for stored functions ignored if function name
894+
--echo # is mixed case
895+
--echo #
896+
897+
CREATE DATABASE B48872;
898+
USE B48872;
899+
CREATE TABLE `TestTab` (id INT);
900+
INSERT INTO `TestTab` VALUES (1),(2);
901+
CREATE FUNCTION `f_Test`() RETURNS INT RETURN 123;
902+
CREATE FUNCTION `f_Test_denied`() RETURNS INT RETURN 123;
903+
CREATE USER 'tester';
904+
CREATE USER 'Tester';
905+
GRANT SELECT ON TABLE `TestTab` TO 'tester';
906+
GRANT EXECUTE ON FUNCTION `f_Test` TO 'tester';
907+
GRANT EXECUTE ON FUNCTION `f_Test_denied` TO 'Tester';
908+
909+
SELECT f_Test();
910+
SELECT * FROM TestTab;
911+
912+
CONNECT (con_tester,localhost,tester,,B48872);
913+
CONNECT (con_tester_denied,localhost,Tester,,B48872);
914+
CONNECTION con_tester;
915+
916+
SELECT * FROM TestTab;
917+
SELECT `f_Test`();
918+
SELECT `F_TEST`();
919+
SELECT f_Test();
920+
SELECT F_TEST();
921+
922+
CONNECTION con_tester_denied;
923+
924+
--error ER_TABLEACCESS_DENIED_ERROR
925+
SELECT * FROM TestTab;
926+
--error ER_PROCACCESS_DENIED_ERROR
927+
SELECT `f_Test`();
928+
--error ER_PROCACCESS_DENIED_ERROR
929+
SELECT `F_TEST`();
930+
--error ER_PROCACCESS_DENIED_ERROR
931+
SELECT f_Test();
932+
--error ER_PROCACCESS_DENIED_ERROR
933+
SELECT F_TEST();
934+
SELECT `f_Test_denied`();
935+
SELECT `F_TEST_DENIED`();
936+
937+
CONNECTION default;
938+
DISCONNECT con_tester;
939+
DISCONNECT con_tester_denied;
940+
DROP TABLE `TestTab`;
941+
DROP FUNCTION `f_Test`;
942+
DROP FUNCTION `f_Test_denied`;
943+
944+
USE test;
945+
DROP USER 'tester';
946+
DROP USER 'Tester';
947+
DROP DATABASE B48872;
948+
892949
--echo End of 5.0 tests.
893950

894951
# Wait till all disconnects are completed

sql/sql_acl.cc

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2280,14 +2280,17 @@ static GRANT_NAME *name_hash_search(HASH *name_hash,
22802280
const char *host,const char* ip,
22812281
const char *db,
22822282
const char *user, const char *tname,
2283-
bool exact)
2283+
bool exact, bool name_tolower)
22842284
{
2285-
char helping [NAME_LEN*2+USERNAME_LENGTH+3];
2285+
char helping [NAME_LEN*2+USERNAME_LENGTH+3], *name_ptr;
22862286
uint len;
22872287
GRANT_NAME *grant_name,*found=0;
22882288
HASH_SEARCH_STATE state;
22892289

2290-
len = (uint) (strmov(strmov(strmov(helping,user)+1,db)+1,tname)-helping)+ 1;
2290+
name_ptr= strmov(strmov(helping, user) + 1, db) + 1;
2291+
len = (uint) (strmov(name_ptr, tname) - helping) + 1;
2292+
if (name_tolower)
2293+
my_casedn_str(files_charset_info, name_ptr);
22912294
for (grant_name= (GRANT_NAME*) hash_first(name_hash, (byte*) helping,
22922295
len, &state);
22932296
grant_name ;
@@ -2320,7 +2323,7 @@ routine_hash_search(const char *host, const char *ip, const char *db,
23202323
{
23212324
return (GRANT_TABLE*)
23222325
name_hash_search(proc ? &proc_priv_hash : &func_priv_hash,
2323-
host, ip, db, user, tname, exact);
2326+
host, ip, db, user, tname, exact, TRUE);
23242327
}
23252328

23262329

@@ -2329,7 +2332,7 @@ table_hash_search(const char *host, const char *ip, const char *db,
23292332
const char *user, const char *tname, bool exact)
23302333
{
23312334
return (GRANT_TABLE*) name_hash_search(&column_priv_hash, host, ip, db,
2332-
user, tname, exact);
2335+
user, tname, exact, FALSE);
23332336
}
23342337

23352338

0 commit comments

Comments
 (0)