mirror of
https://github.com/MariaDB/server.git
synced 2025-01-16 03:52:35 +01:00
Bug#20393 User name truncation in mysql client
Bug#21432 Database/Table name limited to 64 bytes, not chars, problems with multi-byte
This commit is contained in:
parent
109d58af66
commit
af9895d4c2
7 changed files with 45 additions and 8 deletions
|
@ -26,6 +26,9 @@
|
||||||
#define USERNAME_LENGTH 16
|
#define USERNAME_LENGTH 16
|
||||||
#define SERVER_VERSION_LENGTH 60
|
#define SERVER_VERSION_LENGTH 60
|
||||||
#define SQLSTATE_LENGTH 5
|
#define SQLSTATE_LENGTH 5
|
||||||
|
#define SYSTEM_CHARSET_MBMAXLEN 3
|
||||||
|
#define NAME_BYTE_LEN NAME_LEN*SYSTEM_CHARSET_MBMAXLEN
|
||||||
|
#define USERNAME_BYTE_LENGTH USERNAME_LENGTH*SYSTEM_CHARSET_MBMAXLEN
|
||||||
|
|
||||||
#define LOCAL_HOST "localhost"
|
#define LOCAL_HOST "localhost"
|
||||||
#define LOCAL_HOST_NAMEDPIPE "."
|
#define LOCAL_HOST_NAMEDPIPE "."
|
||||||
|
|
|
@ -1340,3 +1340,15 @@ select a from t1 group by a;
|
||||||
a
|
a
|
||||||
e
|
e
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
set names utf8;
|
||||||
|
grant select on test.* to юзер_юзер@localhost;
|
||||||
|
user()
|
||||||
|
юзер_юзер@localhost
|
||||||
|
revoke all on test.* from юзер_юзер@localhost;
|
||||||
|
drop user юзер_юзер@localhost;
|
||||||
|
create database имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
|
||||||
|
use имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
|
||||||
|
select database();
|
||||||
|
database()
|
||||||
|
имя_базы_в_кодировке_утф8_длиной_больше_чем_45
|
||||||
|
drop database имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
|
||||||
|
|
|
@ -1072,4 +1072,20 @@ explain select a from t1 group by a;
|
||||||
select a from t1 group by a;
|
select a from t1 group by a;
|
||||||
drop table t1;
|
drop table t1;
|
||||||
|
|
||||||
|
#
|
||||||
|
# Bug#20393: User name truncation in mysql client
|
||||||
|
# Bug#21432: Database/Table name limited to 64 bytes, not chars, problems with multi-byte
|
||||||
|
#
|
||||||
|
set names utf8;
|
||||||
|
#create user юзер_юзер@localhost;
|
||||||
|
grant select on test.* to юзер_юзер@localhost;
|
||||||
|
--exec $MYSQL --default-character-set=utf8 --user=юзер_юзер -e "select user()"
|
||||||
|
revoke all on test.* from юзер_юзер@localhost;
|
||||||
|
drop user юзер_юзер@localhost;
|
||||||
|
|
||||||
|
create database имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
|
||||||
|
use имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
|
||||||
|
select database();
|
||||||
|
drop database имя_базы_в_кодировке_утф8_длиной_больше_чем_45;
|
||||||
|
|
||||||
# End of 4.1 tests
|
# End of 4.1 tests
|
||||||
|
|
|
@ -1618,7 +1618,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
|
||||||
const char *passwd, const char *db,
|
const char *passwd, const char *db,
|
||||||
uint port, const char *unix_socket,ulong client_flag)
|
uint port, const char *unix_socket,ulong client_flag)
|
||||||
{
|
{
|
||||||
char buff[NAME_LEN+USERNAME_LENGTH+100];
|
char buff[NAME_BYTE_LEN+USERNAME_BYTE_LENGTH+100];
|
||||||
char *end,*host_info;
|
char *end,*host_info;
|
||||||
my_socket sock;
|
my_socket sock;
|
||||||
in_addr_t ip_addr;
|
in_addr_t ip_addr;
|
||||||
|
@ -2063,7 +2063,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
|
||||||
mysql->server_status, client_flag));
|
mysql->server_status, client_flag));
|
||||||
/* This needs to be changed as it's not useful with big packets */
|
/* This needs to be changed as it's not useful with big packets */
|
||||||
if (user && user[0])
|
if (user && user[0])
|
||||||
strmake(end,user,USERNAME_LENGTH); /* Max user name */
|
strmake(end,user,USERNAME_BYTE_LENGTH); /* Max user name */
|
||||||
else
|
else
|
||||||
read_user_name((char*) end);
|
read_user_name((char*) end);
|
||||||
|
|
||||||
|
@ -2093,7 +2093,7 @@ CLI_MYSQL_REAL_CONNECT(MYSQL *mysql,const char *host, const char *user,
|
||||||
/* Add database if needed */
|
/* Add database if needed */
|
||||||
if (db && (mysql->server_capabilities & CLIENT_CONNECT_WITH_DB))
|
if (db && (mysql->server_capabilities & CLIENT_CONNECT_WITH_DB))
|
||||||
{
|
{
|
||||||
end= strmake(end, db, NAME_LEN) + 1;
|
end= strmake(end, db, NAME_BYTE_LEN) + 1;
|
||||||
mysql->db= my_strdup(db,MYF(MY_WME));
|
mysql->db= my_strdup(db,MYF(MY_WME));
|
||||||
db= 0;
|
db= 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2640,7 +2640,11 @@ int mysql_grant(THD *thd, const char *db, List <LEX_USER> &list,
|
||||||
while ((Str = str_list++))
|
while ((Str = str_list++))
|
||||||
{
|
{
|
||||||
if (Str->host.length > HOSTNAME_LENGTH ||
|
if (Str->host.length > HOSTNAME_LENGTH ||
|
||||||
Str->user.length > USERNAME_LENGTH)
|
system_charset_info->cset->charpos(system_charset_info,
|
||||||
|
Str->user.str,
|
||||||
|
Str->user.str +
|
||||||
|
Str->user.length,
|
||||||
|
USERNAME_LENGTH) < Str->user.length)
|
||||||
{
|
{
|
||||||
my_error(ER_GRANT_WRONG_HOST_OR_USER,MYF(0));
|
my_error(ER_GRANT_WRONG_HOST_OR_USER,MYF(0));
|
||||||
result= -1;
|
result= -1;
|
||||||
|
|
|
@ -902,8 +902,8 @@ static int check_connection(THD *thd)
|
||||||
char *user= end;
|
char *user= end;
|
||||||
char *passwd= strend(user)+1;
|
char *passwd= strend(user)+1;
|
||||||
char *db= passwd;
|
char *db= passwd;
|
||||||
char db_buff[NAME_LEN+1]; // buffer to store db in utf8
|
char db_buff[NAME_BYTE_LEN + 1]; // buffer to store db in utf8
|
||||||
char user_buff[USERNAME_LENGTH+1]; // buffer to store user in utf8
|
char user_buff[USERNAME_BYTE_LENGTH + 1]; // buffer to store user in utf8
|
||||||
uint dummy_errors;
|
uint dummy_errors;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -1413,7 +1413,7 @@ char *get_field(MEM_ROOT *mem, Field *field)
|
||||||
|
|
||||||
bool check_db_name(char *name)
|
bool check_db_name(char *name)
|
||||||
{
|
{
|
||||||
char *start=name;
|
uint name_length= 0; // name length in symbols
|
||||||
/* Used to catch empty names and names with end space */
|
/* Used to catch empty names and names with end space */
|
||||||
bool last_char_is_space= TRUE;
|
bool last_char_is_space= TRUE;
|
||||||
|
|
||||||
|
@ -1430,6 +1430,7 @@ bool check_db_name(char *name)
|
||||||
name+system_charset_info->mbmaxlen);
|
name+system_charset_info->mbmaxlen);
|
||||||
if (len)
|
if (len)
|
||||||
{
|
{
|
||||||
|
name_length++;
|
||||||
name += len;
|
name += len;
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
@ -1437,12 +1438,13 @@ bool check_db_name(char *name)
|
||||||
#else
|
#else
|
||||||
last_char_is_space= *name==' ';
|
last_char_is_space= *name==' ';
|
||||||
#endif
|
#endif
|
||||||
|
name_length++;
|
||||||
if (*name == '/' || *name == '\\' || *name == FN_LIBCHAR ||
|
if (*name == '/' || *name == '\\' || *name == FN_LIBCHAR ||
|
||||||
*name == FN_EXTCHAR)
|
*name == FN_EXTCHAR)
|
||||||
return 1;
|
return 1;
|
||||||
name++;
|
name++;
|
||||||
}
|
}
|
||||||
return last_char_is_space || (uint) (name - start) > NAME_LEN;
|
return (last_char_is_space || name_length > NAME_LEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue