diff --git a/sql/mysql_priv.h b/sql/mysql_priv.h index 762c854d180..d73b1f1aac0 100644 --- a/sql/mysql_priv.h +++ b/sql/mysql_priv.h @@ -566,7 +566,8 @@ void get_default_definer(THD *thd, LEX_USER *definer); LEX_USER *create_default_definer(THD *thd); 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_string_length(CHARSET_INFO *cs, LEX_STRING *str, + const char *err_msg, uint max_length); enum enum_mysql_completiontype { ROLLBACK_RELEASE=-2, ROLLBACK=1, ROLLBACK_AND_CHAIN=7, diff --git a/sql/slave.h b/sql/slave.h index c355f7172a9..dee134aaa0c 100644 --- a/sql/slave.h +++ b/sql/slave.h @@ -406,7 +406,7 @@ typedef struct st_master_info /* the variables below are needed because we can change masters on the fly */ char master_log_name[FN_REFLEN]; char host[HOSTNAME_LENGTH+1]; - char user[USERNAME_LENGTH+1]; + char user[USERNAME_BYTE_LENGTH+1]; char password[MAX_PASSWORD_LENGTH+1]; my_bool ssl; // enables use of SSL connection if true char ssl_ca[FN_REFLEN], ssl_capath[FN_REFLEN], ssl_cert[FN_REFLEN]; diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index a88eac84865..e2c147e4cf7 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -7552,6 +7552,7 @@ LEX_USER *get_current_user(THD *thd, LEX_USER *user) SYNOPSIS check_string_length() + cs string charset str string to be checked err_msg error message to be displayed if the string is too long max_length max length @@ -7561,16 +7562,13 @@ LEX_USER *get_current_user(THD *thd, LEX_USER *user) TRUE the passed string is longer than max_length */ -bool check_string_length(LEX_STRING *str, const char *err_msg, - uint max_length) +bool check_string_length(CHARSET_INFO *cs, LEX_STRING *str, + const char *err_msg, uint max_length) { - - if (system_charset_info->cset->charpos(system_charset_info, str->str, - str->str + str->length, max_length) >= - str->length) - return FALSE; + if (cs->cset->charpos(cs, str->str, str->str + str->length, + max_length) >= str->length) + return FALSE; my_error(ER_WRONG_STRING_LENGTH, MYF(0), str->str, err_msg, max_length); - return TRUE; } diff --git a/sql/sql_yacc.yy b/sql/sql_yacc.yy index f98e4a708da..30c7da220a6 100644 --- a/sql/sql_yacc.yy +++ b/sql/sql_yacc.yy @@ -7507,7 +7507,8 @@ user: $$->host.str= (char *) "%"; $$->host.length= 1; - if (check_string_length(&$$->user, ER(ER_USERNAME), USERNAME_LENGTH)) + if (check_string_length(system_charset_info, &$$->user, + ER(ER_USERNAME), USERNAME_LENGTH)) YYABORT; } | ident_or_text '@' ident_or_text @@ -7517,9 +7518,10 @@ user: YYABORT; $$->user = $1; $$->host=$3; - if (check_string_length(&$$->user, ER(ER_USERNAME), USERNAME_LENGTH) || - check_string_length(&$$->host, ER(ER_HOSTNAME), - HOSTNAME_LENGTH)) + if (check_string_length(system_charset_info, &$$->user, + ER(ER_USERNAME), USERNAME_LENGTH) || + check_string_length(&my_charset_latin1, &$$->host, + ER(ER_HOSTNAME), HOSTNAME_LENGTH)) YYABORT; } | CURRENT_USER optional_braces