diff options
author | kroki@mysql.com <> | 2006-07-02 14:35:45 +0400 |
---|---|---|
committer | kroki@mysql.com <> | 2006-07-02 14:35:45 +0400 |
commit | dbdecef4951582fed5e8ff91eccda8fbc9328758 (patch) | |
tree | 2c878e8f57af2a501208576c95d163f6b0d96de2 /sql/item_strfunc.h | |
parent | 3043d29b1f7da7fa19f59cd0d9a3d7e8f2b69777 (diff) | |
download | mariadb-git-dbdecef4951582fed5e8ff91eccda8fbc9328758.tar.gz |
Bug#20570: CURRENT_USER() in a VIEW with SQL SECURITY DEFINER returns
invoker name
The bug was fixed similar to how context switch is handled in
Item_func_sp::execute_impl(): we store pointer to current
Name_resolution_context in Item_func_current_user class, and use
its Security_context in Item_func_current_user::fix_fields().
Diffstat (limited to 'sql/item_strfunc.h')
-rw-r--r-- | sql/item_strfunc.h | 35 |
1 files changed, 27 insertions, 8 deletions
diff --git a/sql/item_strfunc.h b/sql/item_strfunc.h index 90d421a2c68..d73ab75394b 100644 --- a/sql/item_strfunc.h +++ b/sql/item_strfunc.h @@ -385,21 +385,40 @@ public: class Item_func_user :public Item_func_sysconst { - bool is_current; +protected: + bool init (const char *user, const char *host); public: - Item_func_user(bool is_current_arg) - :Item_func_sysconst(), is_current(is_current_arg) {} - String *val_str(String *); + Item_func_user() + { + str_value.set("", 0, system_charset_info); + } + String *val_str(String *) + { + DBUG_ASSERT(fixed == 1); + return (null_value ? 0 : &str_value); + } + bool fix_fields(THD *thd, Item **ref); void fix_length_and_dec() { max_length= ((USERNAME_LENGTH + HOSTNAME_LENGTH + 1) * system_charset_info->mbmaxlen); } - const char *func_name() const - { return is_current ? "current_user" : "user"; } - const char *fully_qualified_func_name() const - { return is_current ? "current_user()" : "user()"; } + const char *func_name() const { return "user"; } + const char *fully_qualified_func_name() const { return "user()"; } +}; + + +class Item_func_current_user :public Item_func_user +{ + Name_resolution_context *context; + +public: + Item_func_current_user(Name_resolution_context *context_arg) + : context(context_arg) {} + bool fix_fields(THD *thd, Item **ref); + const char *func_name() const { return "current_user"; } + const char *fully_qualified_func_name() const { return "current_user()"; } }; |