From a91c595dbc6730085b26842642ce3cbb232c0bd4 Mon Sep 17 00:00:00 2001 From: Mark Riddoch Date: Thu, 6 Feb 2014 13:10:11 +0100 Subject: [PATCH] Fix for allDCB linked list corruption. --- server/core/dcb.c | 23 ++++++++++++++++++++++- server/core/service.c | 2 +- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/server/core/dcb.c b/server/core/dcb.c index 2a86c04fa..d4361c54b 100644 --- a/server/core/dcb.c +++ b/server/core/dcb.c @@ -99,7 +99,7 @@ DCB * dcb_alloc( { DCB *rval; -if ((rval = calloc(1, sizeof(DCB))) == NULL) + if ((rval = calloc(1, sizeof(DCB))) == NULL) { return NULL; } @@ -122,6 +122,7 @@ if ((rval = calloc(1, sizeof(DCB))) == NULL) memset(&rval->stats, 0, sizeof(DCBSTATS)); // Zero the statistics rval->state = DCB_STATE_ALLOC; bitmask_init(&rval->memdata.bitmask); + rval->next = NULL; spinlock_acquire(&dcbspin); if (allDCBs == NULL) @@ -137,6 +138,26 @@ if ((rval = calloc(1, sizeof(DCB))) == NULL) return rval; } + +/** + * Free a DCB that has not been associated with a decriptor. + * + * @param dcb The DCB to free + */ +void +dcb_free(DCB *dcb) +{ + if (dcb->fd == -1) + dcb_final_free(dcb); + else + { + LOGIF(LE, (skygw_log_write_flush( + LOGFILE_ERROR, + "Error : Attempt to free a DCB via dcb_fee " + "that has been associated with a descriptor."))); + } +} + /** * Add the DCB to the end of zombies list. * diff --git a/server/core/service.c b/server/core/service.c index c07e95baa..7e6e32b62 100644 --- a/server/core/service.c +++ b/server/core/service.c @@ -121,7 +121,7 @@ GWPROTOCOL *funcs; if ((funcs = (GWPROTOCOL *)load_module(port->protocol, MODULE_PROTOCOL)) == NULL) { - free(port->listener); + dcb_free(port->listener); port->listener = NULL; LOGIF(LE, (skygw_log_write_flush( LOGFILE_ERROR,