diff options
author | Alexey Kopytov <Alexey.Kopytov@Sun.com> | 2010-05-09 02:03:35 +0400 |
---|---|---|
committer | Alexey Kopytov <Alexey.Kopytov@Sun.com> | 2010-05-09 02:03:35 +0400 |
commit | 5ef2bdea81a68a5440235bb5c841fff5dcc2b2c7 (patch) | |
tree | faf6e2793eae5ff3a0ec48cebf47e8045db0a6ff /sql/table.cc | |
parent | e94c1ab135e035dea4c2db9508d2d635b70bcf80 (diff) | |
parent | 721ec081901b661b9338a47b3144c6c41829165a (diff) | |
download | mariadb-git-5ef2bdea81a68a5440235bb5c841fff5dcc2b2c7.tar.gz |
Manual merge of mysql-5.1-bugteam to mysql-trunk-merge.
Conflicts:
Text conflict in mysql-test/r/grant.result
Text conflict in mysql-test/t/grant.test
Text conflict in mysys/mf_loadpath.c
Text conflict in sql/slave.cc
Text conflict in sql/sql_priv.h
Diffstat (limited to 'sql/table.cc')
-rw-r--r-- | sql/table.cc | 29 |
1 files changed, 26 insertions, 3 deletions
diff --git a/sql/table.cc b/sql/table.cc index 65918dd58f9..5e648f5097a 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -500,6 +500,26 @@ inline bool is_system_table_name(const char *name, uint length) } +/** + Check if a string contains path elements +*/ + +static inline bool has_disabled_path_chars(const char *str) +{ + for (; *str; str++) + switch (*str) + { + case FN_EXTCHAR: + case '/': + case '\\': + case '~': + case '@': + return TRUE; + } + return FALSE; +} + + /* Read table definition from a binary / text based .frm file @@ -556,7 +576,8 @@ int open_table_def(THD *thd, TABLE_SHARE *share, uint db_flags) This kind of tables must have been opened only by the mysql_file_open() above. */ - if (strchr(share->table_name.str, '@') || + if (has_disabled_path_chars(share->table_name.str) || + has_disabled_path_chars(share->db.str) || !strncmp(share->db.str, MYSQL50_TABLE_NAME_PREFIX, MYSQL50_TABLE_NAME_PREFIX_LENGTH) || !strncmp(share->table_name.str, MYSQL50_TABLE_NAME_PREFIX, @@ -2769,7 +2790,6 @@ bool check_db_name(LEX_STRING *org_name) (name_length > NAME_CHAR_LEN)); /* purecov: inspected */ } - /* Allow anything as a table name, as long as it doesn't contain an ' ' at the end @@ -2777,7 +2797,7 @@ bool check_db_name(LEX_STRING *org_name) */ -bool check_table_name(const char *name, uint length) +bool check_table_name(const char *name, uint length, bool check_for_path_chars) { uint name_length= 0; // name length in symbols const char *end= name+length; @@ -2804,6 +2824,9 @@ bool check_table_name(const char *name, uint length) continue; } } + if (check_for_path_chars && + (*name == '/' || *name == '\\' || *name == '~' || *name == FN_EXTCHAR)) + return 1; #endif name++; name_length++; |