mysql_client.c:gw_client_close didn't close client session in cases where session->state == SESSION_STATE_STOPPING. That is a bug and lead to situation where session wasn't closed at all.
Also changed 'authorization failed' to 'access denied' mysql_common.c: fixed memory leak in gw_receive_backend_auth, and replaced error code '2800' with '28000'. readconnroute.c:handleError didn't set *succp pointer so uninitialized value was used in caller's context. makefile.inc: added -lm to linker flags mysql_backend.c: added a few comments
This commit is contained in:
@ -199,6 +199,7 @@ static int gw_read_backend_event(DCB *dcb) {
|
||||
|
||||
if (backend_protocol->protocol_auth_state == MYSQL_CONNECTED)
|
||||
{
|
||||
/** Read cached backend handshake */
|
||||
if (gw_read_backend_handshake(backend_protocol) != 0)
|
||||
{
|
||||
backend_protocol->protocol_auth_state = MYSQL_AUTH_FAILED;
|
||||
@ -209,11 +210,13 @@ static int gw_read_backend_event(DCB *dcb) {
|
||||
"state = MYSQL_AUTH_FAILED.",
|
||||
pthread_self(),
|
||||
backend_protocol->owner_dcb->fd)));
|
||||
|
||||
}
|
||||
else
|
||||
else
|
||||
{
|
||||
/* handshake decoded, send the auth credentials */
|
||||
/**
|
||||
* Decode password and send the auth credentials
|
||||
* to backend.
|
||||
*/
|
||||
if (gw_send_authentication_to_backend(
|
||||
current_session->db,
|
||||
current_session->user,
|
||||
@ -227,16 +230,16 @@ static int gw_read_backend_event(DCB *dcb) {
|
||||
"gw_send_authentication_to_backend "
|
||||
"fd %d, state = MYSQL_AUTH_FAILED.",
|
||||
pthread_self(),
|
||||
backend_protocol->owner_dcb->fd)));
|
||||
}
|
||||
else
|
||||
backend_protocol->owner_dcb->fd)));
|
||||
}
|
||||
else
|
||||
{
|
||||
backend_protocol->protocol_auth_state = MYSQL_AUTH_RECV;
|
||||
}
|
||||
}
|
||||
}
|
||||
spinlock_release(&dcb->authlock);
|
||||
}
|
||||
} /*< backend_protocol->protocol_auth_state == MYSQL_CONNECTED */
|
||||
/*
|
||||
* Now:
|
||||
* -- check the authentication reply from backend
|
||||
@ -266,9 +269,10 @@ static int gw_read_backend_event(DCB *dcb) {
|
||||
router_instance = session->service->router_instance;
|
||||
rsession = session->router_session;
|
||||
|
||||
if (backend_protocol->protocol_auth_state == MYSQL_AUTH_RECV) {
|
||||
/*<
|
||||
* Read backed auth reply
|
||||
if (backend_protocol->protocol_auth_state == MYSQL_AUTH_RECV)
|
||||
{
|
||||
/**
|
||||
* Read backed's reply to authentication message
|
||||
*/
|
||||
receive_rc =
|
||||
gw_receive_backend_auth(backend_protocol);
|
||||
@ -283,7 +287,6 @@ static int gw_read_backend_event(DCB *dcb) {
|
||||
"fd %d, state = MYSQL_AUTH_FAILED.",
|
||||
pthread_self(),
|
||||
backend_protocol->owner_dcb->fd)));
|
||||
|
||||
|
||||
LOGIF(LE, (skygw_log_write_flush(
|
||||
LOGFILE_ERROR,
|
||||
@ -362,8 +365,8 @@ static int gw_read_backend_event(DCB *dcb) {
|
||||
0,
|
||||
"Authentication with backend failed. "
|
||||
"Session will be closed.");
|
||||
|
||||
router->handleError(router_instance,
|
||||
|
||||
router->handleError(router_instance,
|
||||
rsession,
|
||||
errbuf,
|
||||
dcb,
|
||||
@ -371,7 +374,6 @@ static int gw_read_backend_event(DCB *dcb) {
|
||||
&succp);
|
||||
|
||||
ss_dassert(!succp);
|
||||
|
||||
LOGIF(LD, (skygw_log_write(
|
||||
LOGFILE_DEBUG,
|
||||
"%lu [gw_read_backend_event] "
|
||||
@ -412,7 +414,7 @@ static int gw_read_backend_event(DCB *dcb) {
|
||||
}
|
||||
}
|
||||
} /* MYSQL_AUTH_RECV || MYSQL_AUTH_FAILED */
|
||||
|
||||
|
||||
spinlock_release(&dcb->authlock);
|
||||
|
||||
} /* MYSQL_AUTH_RECV || MYSQL_AUTH_FAILED */
|
||||
@ -1048,6 +1050,10 @@ gw_backend_close(DCB *dcb)
|
||||
|
||||
mysql_protocol_done(dcb);
|
||||
|
||||
/**
|
||||
* If session->state is set to STOPPING the client and the session must
|
||||
* be closed too.
|
||||
*/
|
||||
if (session != NULL && session->state == SESSION_STATE_STOPPING)
|
||||
{
|
||||
client_dcb = session->client;
|
||||
|
Reference in New Issue
Block a user