Fix COM_CHANGE_USER handling in MySQLBackend

When a COM_CHANGE_USER statement was executed, the new user credentials
were copied after the authentication message was sent. This caused the
COM_CHANGE_USER to always succeed the first time as it used the current
credentials. The user credentials would always lag behind by one.
This commit is contained in:
Markus Makela
2016-10-31 14:52:15 +02:00
parent 6835fe4db9
commit 7b4561e3f4

View File

@ -1900,13 +1900,19 @@ static int gw_change_user(DCB *backend,
} }
else else
{ {
rv = gw_send_change_user_to_backend(database, username, client_sha1, backend_protocol); /** This assumes that authentication will succeed. If authentication fails,
/* * the internal session will represent the wrong user. This is wrong and
* Now copy new data into user session * a check whether the COM_CHANGE_USER succeeded should be done in the
*/ * backend protocol reply handling.
*
* For the time being, it is simpler to assume a COM_CHANGE_USER will always
* succeed if the authentication in MaxScale is successful. In practice this
* might not be true but these cases are handled by the router modules
* and the servers that fail to execute the COM_CHANGE_USER are discarded. */
strcpy(current_session->user, username); strcpy(current_session->user, username);
strcpy(current_session->db, database); strcpy(current_session->db, database);
memcpy(current_session->client_sha1, client_sha1, sizeof(current_session->client_sha1)); memcpy(current_session->client_sha1, client_sha1, sizeof(current_session->client_sha1));
rv = gw_send_change_user_to_backend(database, username, client_sha1, backend_protocol);
} }
retblock: retblock: