Place checks in callback routines because DCB will not always contain a reference to a router session, and the associated data will be invalid in this case.

This commit is contained in:
counterpoint
2015-09-25 12:17:11 +01:00
parent 2dfb9e3c11
commit 2231d0870c
5 changed files with 39 additions and 5 deletions

View File

@ -2574,11 +2574,6 @@ dcb_call_callback(DCB *dcb, DCB_REASON reason)
{
DCB_CALLBACK *cb, *nextcb;
if (NULL == dcb->session->router_session)
{
dcb_close(dcb);
return;
}
spinlock_acquire(&dcb->cb_lock);
cb = dcb->callbacks;
while (cb)

View File

@ -38,6 +38,7 @@
* 19/03/2015 Massimiliano Pinto Addition of basic MariaDB 10 compatibility support
* 07/05/2015 Massimiliano Pinto Added MariaDB 10 Compatibility
* 11/05/2015 Massimiliano Pinto Only MariaDB 10 Slaves can register to binlog router with a MariaDB 10 Master
* 25/09/2015 Martin Brampton Block callback processing when no router session in the DCB
*
* @endverbatim
*/
@ -1606,6 +1607,15 @@ blr_slave_callback(DCB *dcb, DCB_REASON reason, void *data)
ROUTER_SLAVE *slave = (ROUTER_SLAVE *)data;
ROUTER_INSTANCE *router = slave->router;
if (NULL == dcb->session->router_session)
{
/*
* The following processing will fail if there is no router session,
* because the "data" parameter will not contain meaningful data,
* so we have no choice but to stop here.
*/
return;
}
if (reason == DCB_REASON_DRAINED)
{
if (slave->state == BLRS_DUMPING)

View File

@ -69,6 +69,7 @@
* 27/06/2014 Mark Riddoch Addition of server weighting
* 11/06/2015 Martin Brampton Remove decrement n_current (moved to dcb.c)
* 09/09/2015 Martin Brampton Modify error handler
* 25/09/2015 Martin Brampton Block callback processing when no router session in the DCB
*
* @endverbatim
*/
@ -1010,6 +1011,14 @@ static int handle_state_switch(DCB* dcb,DCB_REASON reason, void * routersession)
SERVICE* service = session->service;
ROUTER* router = (ROUTER *)service->router;
if (NULL == dcb->session->router_session && DCB_REASON_ERROR != reason)
{
/*
* We cannot handle a DCB that does not have a router session,
* except in the case where error processing is invoked.
*/
return;
}
switch(reason)
{
case DCB_REASON_CLOSE:

View File

@ -71,6 +71,7 @@ extern __thread log_info_t tls_log_info;
* 17/07/2014 Massimiliano Pinto Server connection counter is updated in closeSession
*
* 09/09/2015 Martin Brampton Modify error handler
* 25/09/2015 Martin Brampton Block callback processing when no router session in the DCB
*
* @endverbatim
*/
@ -5308,6 +5309,15 @@ static int router_handle_state_switch(
int rc = 1;
SERVER* srv;
CHK_DCB(dcb);
if (NULL == dcb->session->router_session)
{
/*
* The following processing will fail if there is no router session,
* because the "data" parameter will not contain meaningful data,
* so we have no choice but to stop here.
*/
return;
}
bref = (backend_ref_t *)data;
CHK_BACKEND_REF(bref);

View File

@ -59,6 +59,7 @@ extern __thread log_info_t tls_log_info;
* Date Who Description
* 01/12/2014 Vilho Raatikka/Markus Mäkelä Initial implementation
* 09/09/2015 Martin Brampton Modify error handler
* 25/09/2015 Martin Brampton Block callback processing when no router session in the DCB
*
* @endverbatim
*/
@ -4404,6 +4405,15 @@ router_handle_state_switch(
SERVER* srv;
CHK_DCB(dcb);
if (NULL == dcb->session->router_session)
{
/*
* The following processing will fail if there is no router session,
* because the "data" parameter will not contain meaningful data,
* so we have no choice but to stop here.
*/
return;
}
bref = (backend_ref_t *) data;
CHK_BACKEND_REF(bref);