aboutsummaryrefslogtreecommitdiff
path: root/src/server/server.c
diff options
context:
space:
mode:
authorMarc Schink <openocd-dev@marcschink.de>2017-01-07 17:43:49 +0100
committerTomas Vanek <vanekt@fbl.cz>2018-03-07 23:42:49 +0000
commitc1c450e0f75a5ed11b2163a1e21dd9516dc07618 (patch)
treebc739dec0dd07120cb1c7a83c194b168e111092c /src/server/server.c
parentfd6986168a5e9f33b8dba628b9d9e42196c02923 (diff)
downloadriscv-openocd-c1c450e0f75a5ed11b2163a1e21dd9516dc07618.zip
riscv-openocd-c1c450e0f75a5ed11b2163a1e21dd9516dc07618.tar.gz
riscv-openocd-c1c450e0f75a5ed11b2163a1e21dd9516dc07618.tar.bz2
server/server: Remove all connections on shutdown
This patch fixes a memory leak in the internal server. Steps for reproduction: * valgrind --leak-check=full --show-reachable=yes ./build/src/openocd * Establish more than one connection to OpenOCD (e.g. telnet) * Shutdown OpenOCD * Check for memory leaks in add_connection() Change-Id: I0ae6fcf2918fd9bdec350446d3e26742d08ff698 Signed-off-by: Marc Schink <openocd-dev@marcschink.de> Reviewed-on: http://openocd.zylin.com/4053 Tested-by: jenkins Reviewed-by: Tomas Vanek <vanekt@fbl.cz>
Diffstat (limited to 'src/server/server.c')
-rw-r--r--src/server/server.c17
1 files changed, 17 insertions, 0 deletions
diff --git a/src/server/server.c b/src/server/server.c
index 46c860f..6fa864b 100644
--- a/src/server/server.c
+++ b/src/server/server.c
@@ -345,6 +345,21 @@ int add_service(char *name,
return ERROR_OK;
}
+static void remove_connections(struct service *service)
+{
+ struct connection *connection;
+
+ connection = service->connections;
+
+ while (connection) {
+ struct connection *tmp;
+
+ tmp = connection->next;
+ remove_connection(service, connection);
+ connection = tmp;
+ }
+}
+
static int remove_services(void)
{
struct service *c = services;
@@ -353,6 +368,8 @@ static int remove_services(void)
while (c) {
struct service *next = c->next;
+ remove_connections(c);
+
if (c->name)
free(c->name);