mirror of
https://github.com/MariaDB/server.git
synced 2025-08-08 11:22:35 +03:00
MDEV-36480 USAN: checking identifier names for 0 length names
Identifier names can be empty in the grammar. The check_ident_length is used from everything from triggers, to partitions, to key names and UDF names. This change updates 0 length identifiers as valid without further checking. Primary keys are one clear case where a empty name is used and the name.str is a null pointer. Checking empty names where the key->name.str is a null pointer results in a UBSAN error in Well_formed_prefix_status further down the stack which we can avoid.
This commit is contained in:
@@ -10389,7 +10389,13 @@ bool check_string_char_length(const LEX_CSTRING *str, uint err_msg,
|
|||||||
|
|
||||||
bool check_ident_length(const LEX_CSTRING *ident)
|
bool check_ident_length(const LEX_CSTRING *ident)
|
||||||
{
|
{
|
||||||
if (check_string_char_length(ident, 0, NAME_CHAR_LEN, system_charset_info, 1))
|
/*
|
||||||
|
string_char_length desite the names, goes into Well_formed_prefix_status
|
||||||
|
so this is more than just a length comparison. Things like a primary key
|
||||||
|
doesn't have a name, therefore no length. Also the ident grammar allows
|
||||||
|
empty backtick. Check quickly the length, and if 0, accept that.
|
||||||
|
*/
|
||||||
|
if (ident->length && check_string_char_length(ident, 0, NAME_CHAR_LEN, system_charset_info, 1))
|
||||||
{
|
{
|
||||||
my_error(ER_TOO_LONG_IDENT, MYF(0), ident->str);
|
my_error(ER_TOO_LONG_IDENT, MYF(0), ident->str);
|
||||||
return 1;
|
return 1;
|
||||||
|
Reference in New Issue
Block a user