mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
MDEV-25197: The statement set password=password('') executed in PS mode fails in case it is run by a user with expired password
A user connected to a server with an expired password can't change password with the statement "SET password=..." if this statement is run in PS mode. In mentioned use case a user gets the error ER_MUST_CHANGE_PASSWORD on attempt to run the statement PREPARE stmt FOR "SET password=..."; The reason of failure to reset password by a locked user using the statement PREPARE stmt FOR "SET password=..." is that PS-related statements are not listed among the commands allowed for execution by a user with expired password. However, simple adding of PS-related statements (PREPARE FOR/EXECUTE/DEALLOCATE PREPARE ) to the list of statements allowed for execution by a locked user is not enough to solve problems, since it opens the opportunity for a locked user to execute any statement in the PS mode. To exclude this opportunity, additional checking that the statement being prepared for execution in PS-mode is the SET statement has to be added. This extra checking has been added by this patch into the method Prepared_statement::prepared() that executed on preparing any statement for execution in PS-mode.
This commit is contained in:
@ -4217,6 +4217,15 @@ bool Prepared_statement::prepare(const char *packet, uint packet_len)
|
||||
thd->is_error() ||
|
||||
init_param_array(this));
|
||||
|
||||
if (thd->security_ctx->password_expired &&
|
||||
lex->sql_command != SQLCOM_SET_OPTION)
|
||||
{
|
||||
thd->restore_backup_statement(this, &stmt_backup);
|
||||
thd->restore_active_arena(this, &stmt_backup);
|
||||
thd->stmt_arena= old_stmt_arena;
|
||||
my_error(ER_MUST_CHANGE_PASSWORD, MYF(0));
|
||||
DBUG_RETURN(true);
|
||||
}
|
||||
lex->set_trg_event_type_for_tables();
|
||||
|
||||
/*
|
||||
|
Reference in New Issue
Block a user