mirror of
https://github.com/MariaDB/server.git
synced 2025-01-31 11:01:52 +01:00
bug#14163155 COM_CHANGE_USER DOESN'T WORK WITH CHARACTER-SET-SERVER=UCS2 IN
5.1 SERVER Problem was caused by the COM_CHANGE_USER parsing code. That code ignored character set number passed in COM_CHANGE_USER packet. Instead character_set_client values was used. User name was not converted at all. Fixed by using passed character set number to convert both db and user names. If COM_CHANGE_USER does not contain character set number then character_set_client is used to convert both names.
This commit is contained in:
parent
370ac0669e
commit
cb08544b57
1 changed files with 21 additions and 14 deletions
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
|
||||
Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
|
||||
|
||||
This program is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -1109,6 +1109,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||
char *user= (char*) packet, *packet_end= packet + packet_length;
|
||||
/* Safe because there is always a trailing \0 at the end of the packet */
|
||||
char *passwd= strend(user)+1;
|
||||
uint user_length= passwd - user - 1;
|
||||
|
||||
thd->change_user();
|
||||
thd->clear_error(); // if errors from rollback
|
||||
|
@ -1122,6 +1123,7 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||
for *passwd > 127 and become 2**32-127 after casting to uint.
|
||||
*/
|
||||
char db_buff[NAME_LEN+1]; // buffer to store db in utf8
|
||||
char user_buff[USERNAME_LENGTH + 1]; // buffer to store user in utf8
|
||||
char *db= passwd;
|
||||
char *save_db;
|
||||
/*
|
||||
|
@ -1172,15 +1174,31 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||
my_error(ER_WRONG_VALUE_FOR_VAR, MYF(0), "character_set_client",
|
||||
cs->csname);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (cs_number)
|
||||
{
|
||||
/*
|
||||
We have checked charset earlier,
|
||||
so thd_init_client_charset cannot fail.
|
||||
*/
|
||||
if (thd_init_client_charset(thd, cs_number))
|
||||
DBUG_ASSERT(0);
|
||||
thd->update_charset();
|
||||
}
|
||||
}
|
||||
|
||||
/* Convert database name to utf8 */
|
||||
/* Convert database and user names to utf8 */
|
||||
db_buff[copy_and_convert(db_buff, sizeof(db_buff)-1,
|
||||
system_charset_info, db, db_length,
|
||||
thd->charset(), &dummy_errors)]= 0;
|
||||
db= db_buff;
|
||||
|
||||
user_buff[copy_and_convert(user_buff,sizeof(user_buff)-1,
|
||||
system_charset_info, user, user_length,
|
||||
thd->charset(), &dummy_errors)]= 0;
|
||||
user= user_buff;
|
||||
|
||||
/* Save user and privileges */
|
||||
save_db_length= thd->db_length;
|
||||
save_db= thd->db;
|
||||
|
@ -1215,17 +1233,6 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
|
|||
#endif /* NO_EMBEDDED_ACCESS_CHECKS */
|
||||
x_free(save_db);
|
||||
x_free(save_security_ctx.user);
|
||||
|
||||
if (cs_number)
|
||||
{
|
||||
/*
|
||||
We have checked charset earlier,
|
||||
so thd_init_client_charset cannot fail.
|
||||
*/
|
||||
if (thd_init_client_charset(thd, cs_number))
|
||||
DBUG_ASSERT(0);
|
||||
thd->update_charset();
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue