From 484ff06795adafa05f40cb1a686f3e2c9d2086d5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Markus=20M=C3=A4kel=C3=A4?= Date: Thu, 19 Dec 2019 13:22:10 +0200 Subject: [PATCH] MXS-619: Send fake response for unconnected DCBs This causes the connection failure to be counted as an authentication failure instead of a connection error. The former never causes the host to be blocked which effectively solves the problem for most cases. The only case where this would not work is where the network buffer for a backend DCB is full right after the connection is created. --- .../protocol/MySQL/mariadbbackend/mysql_backend.cc | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/server/modules/protocol/MySQL/mariadbbackend/mysql_backend.cc b/server/modules/protocol/MySQL/mariadbbackend/mysql_backend.cc index ef904c4f4..b40f54bb1 100644 --- a/server/modules/protocol/MySQL/mariadbbackend/mysql_backend.cc +++ b/server/modules/protocol/MySQL/mariadbbackend/mysql_backend.cc @@ -1415,10 +1415,20 @@ static int gw_backend_hangup(DCB* dcb) static int gw_backend_close(DCB* dcb) { mxb_assert(dcb->session); + MySQLProtocol* proto = (MySQLProtocol*)dcb->protocol; + + if (proto->protocol_auth_state == MXS_AUTH_STATE_INIT + || proto->protocol_auth_state == MXS_AUTH_STATE_PENDING_CONNECT + || proto->protocol_auth_state == MXS_AUTH_STATE_CONNECTED) + { + MYSQL_session client; + gw_get_shared_session_auth_info(dcb->session->client_dcb, &client); + memset(proto->scramble, 0, sizeof(proto->scramble)); + dcb_write(dcb, gw_generate_auth_response(&client, proto, false, false, 0)); + } /** Send COM_QUIT to the backend being closed */ - GWBUF* quitbuf = mysql_create_com_quit(NULL, 0); - mysql_send_com_quit(dcb, 0, quitbuf); + dcb_write(dcb, mysql_create_com_quit(NULL, 0)); /** Free protocol data */ mysql_protocol_done(dcb);