summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--mysql-test/r/create.result2
-rw-r--r--mysql-test/t/create.test5
-rw-r--r--sql/mysql_priv.h1
-rw-r--r--sql/sql_parse.cc32
-rw-r--r--sql/sql_yacc.yy3
5 files changed, 41 insertions, 2 deletions
diff --git a/mysql-test/r/create.result b/mysql-test/r/create.result
index 2d668499df3..d37c1a04daa 100644
--- a/mysql-test/r/create.result
+++ b/mysql-test/r/create.result
@@ -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)
diff --git a/mysql-test/t/create.test b/mysql-test/t/create.test
index 61ee40477ee..a837653d618 100644
--- a/mysql-test/t/create.test
+++ b/mysql-test/t/create.test
@@ -1171,6 +1171,11 @@ CREATE TABLE t1(c1 VARCHAR(33), KEY USING HASH (c1) USING BTREE) ENGINE=MEMORY;
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()
diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h
index 948dd537b83..1568f042b7e 100644
--- a/sql/mysql_priv.h
+++ b/sql/mysql_priv.h
@@ -614,6 +614,7 @@ LEX_USER *create_definer(THD *thd, LEX_STRING *user_name, LEX_STRING *host_name)
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,
diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc
index 83b111b7c4c..713aca9de47 100644
--- a/sql/sql_parse.cc
+++ b/sql/sql_parse.cc
@@ -7982,3 +7982,35 @@ int test_if_data_home_dir(const char *dir)
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;
+}
diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy
index c04eca6bd3f..0eefe782354 100644
--- a/sql/sql_yacc.yy
+++ b/sql/sql_yacc.yy
@@ -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