diff options
author | Sergei Golubchik <serg@mariadb.org> | 2015-02-27 20:13:51 +0100 |
---|---|---|
committer | Sergei Golubchik <serg@mariadb.org> | 2015-02-28 19:48:22 +0100 |
commit | ba80708f66fca32c7c2fbc66879177e5590e53fb (patch) | |
tree | 65dded9078148beac96f20bf5b833e2de231b306 /sql/set_var.cc | |
parent | 7951bb16565e84a87d5289fa3eb4450bdf50ab96 (diff) | |
download | mariadb-git-ba80708f66fca32c7c2fbc66879177e5590e53fb.tar.gz |
MDEV-6960 Server crashes in check_alter_user on setting a default role via PS
There were two issues:
* set_var_default_role::user was overwritten with a new value,
allocated in the thd->mem_root, which is reset between executions.
That was causing the crash. Solved by introducing set_var_default_role::real_user
* when privilege tables were opened on EXECUTE, the reprepare_observer
would abort the statement (as privilege tables are opened using
the local TABLE_LIST that doesn't preserve metadata from PREPARE, so
reprepare_observer thought they're changed). This issue also applied
to SET PASSWORD. Solved by disabling reprepare_observer.
Diffstat (limited to 'sql/set_var.cc')
-rw-r--r-- | sql/set_var.cc | 16 |
1 files changed, 12 insertions, 4 deletions
diff --git a/sql/set_var.cc b/sql/set_var.cc index e994745db68..278a05213a6 100644 --- a/sql/set_var.cc +++ b/sql/set_var.cc @@ -860,7 +860,11 @@ int set_var_password::check(THD *thd) int set_var_password::update(THD *thd) { #ifndef NO_EMBEDDED_ACCESS_CHECKS - return change_password(thd, user); + Reprepare_observer *save_reprepare_observer= thd->m_reprepare_observer; + thd->m_reprepare_observer= 0; + int res= change_password(thd, user); + thd->m_reprepare_observer= save_reprepare_observer; + return res; #else return 0; #endif @@ -896,8 +900,8 @@ int set_var_role::update(THD *thd) int set_var_default_role::check(THD *thd) { #ifndef NO_EMBEDDED_ACCESS_CHECKS - user= get_current_user(thd, user); - int status= acl_check_set_default_role(thd, user->host.str, user->user.str); + real_user= get_current_user(thd, user); + int status= acl_check_set_default_role(thd, real_user->host.str, real_user->user.str); return status; #else return 0; @@ -907,7 +911,11 @@ int set_var_default_role::check(THD *thd) int set_var_default_role::update(THD *thd) { #ifndef NO_EMBEDDED_ACCESS_CHECKS - return acl_set_default_role(thd, user->host.str, user->user.str, role.str); + Reprepare_observer *save_reprepare_observer= thd->m_reprepare_observer; + thd->m_reprepare_observer= 0; + int res= acl_set_default_role(thd, real_user->host.str, real_user->user.str, role.str); + thd->m_reprepare_observer= save_reprepare_observer; + return res; #else return 0; #endif |