From: Date: October 2 2008 1:58pm Subject: bzr commit into mysql-5.0-bugteam branch (Sergey.Glukhov:2694) Bug#35924 List-Archive: http://lists.mysql.com/commits/55067 X-Bug: 35924 Message-Id: <0K8400FKA198HDE0@fe-emea-09.sun.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7BIT #At file:///home/gluh/MySQL/mysql-5.0-bugteam/ 2694 Sergey Glukhov 2008-10-02 Bug#35924 DEFINER should be stored 'quoted' in I_S The '@' symbol can not be used in the host name according to rfc952. The fix: added function check_host_name(LEX_STRING *str) which checks that all symbols in host name string are valid and host name length is not more than max host name length (just moved check_string_length() function from the parser into check_host_name()). modified: mysql-test/r/create.result mysql-test/t/create.test sql/mysql_priv.h sql/sql_parse.cc sql/sql_yacc.yy per-file messages: mysql-test/r/create.result test result mysql-test/t/create.test test case sql/mysql_priv.h added function check_host_name(LEX_STRING *str) sql/sql_parse.cc added function check_host_name(LEX_STRING *str) which checks that all symbols in host name string are valid and host name length is not more than max host name length(HOSTNAME_LENGTH). sql/sql_yacc.yy using newly added function check_host_name() === modified file 'mysql-test/r/create.result' --- a/mysql-test/r/create.result 2008-09-03 10:17:19 +0000 +++ b/mysql-test/r/create.result 2008-10-02 11:57:52 +0000 @@ -1546,6 +1546,8 @@ SHOW INDEX FROM t1; Table Non_unique Key_name Seq_in_index Column_name Collation Cardinality Sub_part Packed Null Index_type Comment t1 1 c1 1 c1 A NULL NULL NULL YES BTREE DROP TABLE t1; +create user mysqltest_1@'test@test'; +ERROR HY000: Malformed hostname (illegal symbol: '@') CREATE TABLE t1 (a INTEGER AUTO_INCREMENT PRIMARY KEY, b INTEGER NOT NULL); INSERT IGNORE INTO t1 (b) VALUES (5); CREATE TABLE IF NOT EXISTS t2 (a INTEGER NOT NULL AUTO_INCREMENT PRIMARY KEY) === modified file 'mysql-test/t/create.test' --- a/mysql-test/t/create.test 2008-09-03 10:17:19 +0000 +++ b/mysql-test/t/create.test 2008-10-02 11:57:52 +0000 @@ -1171,6 +1171,11 @@ CREATE TABLE t1(c1 VARCHAR(33), KEY USIN SHOW INDEX FROM t1; DROP TABLE t1; +# +# Bug#35924 DEFINER should be stored 'quoted' in I_S +# +--error ER_UNKNOWN_ERROR +create user mysqltest_1@'test@test'; # # Bug#38821: Assert table->auto_increment_field_not_null failed in open_table() === modified file 'sql/mysql_priv.h' --- a/sql/mysql_priv.h 2008-08-26 08:32:43 +0000 +++ b/sql/mysql_priv.h 2008-10-02 11:57:52 +0000 @@ -614,6 +614,7 @@ LEX_USER *create_definer(THD *thd, LEX_S LEX_USER *get_current_user(THD *thd, LEX_USER *user); bool check_string_length(LEX_STRING *str, const char *err_msg, uint max_length); +bool check_host_name(LEX_STRING *str); enum enum_mysql_completiontype { ROLLBACK_RELEASE=-2, ROLLBACK=1, ROLLBACK_AND_CHAIN=7, === modified file 'sql/sql_parse.cc' --- a/sql/sql_parse.cc 2008-08-26 08:32:43 +0000 +++ b/sql/sql_parse.cc 2008-10-02 11:57:52 +0000 @@ -7982,3 +7982,35 @@ int test_if_data_home_dir(const char *di C_MODE_END + +/** + Check that host name string is valid. + + @param[in] str string to be checked + + @return Operation status + @retval FALSE host name is ok + @retval TRUE host name string is longer than max_length or + has invalid symbols +*/ + +bool check_host_name(LEX_STRING *str) +{ + const char *name= str->str; + const char *end= str->str + str->length; + if (check_string_length(str, ER(ER_HOSTNAME), HOSTNAME_LENGTH)) + return TRUE; + + while (name != end) + { + if (*name == '@') + { + my_printf_error(ER_UNKNOWN_ERROR, + "Malformed hostname (illegal symbol: '%c')", MYF(0), + *name); + return TRUE; + } + name++; + } + return FALSE; +} === modified file 'sql/sql_yacc.yy' --- a/sql/sql_yacc.yy 2008-08-11 16:10:00 +0000 +++ b/sql/sql_yacc.yy 2008-10-02 11:57:52 +0000 @@ -9269,8 +9269,7 @@ user: if (check_string_length(&$$->user, ER(ER_USERNAME), USERNAME_LENGTH) || - check_string_length(&$$->host, - ER(ER_HOSTNAME), HOSTNAME_LENGTH)) + check_host_name(&$$->host)) MYSQL_YYABORT; } | CURRENT_USER optional_braces