From ee7b799bf1c17f6b71986429c19703b2fd2df0e9 Mon Sep 17 00:00:00 2001 From: Mark Riddoch Date: Thu, 26 Sep 2013 17:38:35 +0200 Subject: [PATCH] Bug 160 - fixed memory leaks with telnetd and debug CLI --- server/core/buffer.c | 1 + server/modules/protocol/telnetd.c | 10 ++++++++-- server/modules/routing/debugcli.c | 7 +++++++ 3 files changed, 16 insertions(+), 2 deletions(-) diff --git a/server/core/buffer.c b/server/core/buffer.c index 505f3e039..28abcb96c 100644 --- a/server/core/buffer.c +++ b/server/core/buffer.c @@ -179,6 +179,7 @@ GWBUF * gwbuf_consume(GWBUF *head, unsigned int length) { GWBUF *rval = head; + CHK_GWBUF(head); GWBUF_CONSUME(head, length); if (GWBUF_EMPTY(head)) diff --git a/server/modules/protocol/telnetd.c b/server/modules/protocol/telnetd.c index 8a9c77e2f..94c42b3cc 100644 --- a/server/modules/protocol/telnetd.c +++ b/server/modules/protocol/telnetd.c @@ -167,7 +167,7 @@ char *password, *t; telnetd->state = TELNETD_STATE_PASSWD; dcb_printf(dcb, "Password: "); telnetd_echo(dcb, 0); - GWBUF_CONSUME(head, GWBUF_LENGTH(head)); + gwbuf_consume(head, GWBUF_LENGTH(head)); break; case TELNETD_STATE_PASSWD: password = strndup(GWBUF_DATA(head), GWBUF_LENGTH(head)); @@ -186,8 +186,9 @@ char *password, *t; dcb_printf(dcb, "\n\rLogin incorrect\n\rLogin: "); telnetd_echo(dcb, 1); telnetd->state = TELNETD_STATE_LOGIN; + free(telnetd->username); } - GWBUF_CONSUME(head, GWBUF_LENGTH(head)); + gwbuf_consume(head, GWBUF_LENGTH(head)); free(password); break; case TELNETD_STATE_DATA: @@ -195,6 +196,11 @@ char *password, *t; break; } } + else + { + // Force the free of the buffer header + gwbuf_consume(head, 0); + } } } return n; diff --git a/server/modules/routing/debugcli.c b/server/modules/routing/debugcli.c index f168474f1..2b407b45c 100644 --- a/server/modules/routing/debugcli.c +++ b/server/modules/routing/debugcli.c @@ -208,10 +208,17 @@ CLI_SESSION *session = (CLI_SESSION *)router_session; */ } +/** + * Free a debugcli session + * + * @param router_instance The router session + * @param router_client_session The router session as returned from newSession + */ static void freeSession( ROUTER* router_instance, void* router_client_session) { + free(router_client_session); return; }