server/server: Remove all connections on shutdown 53/4053/4
authorMarc Schink <openocd-dev@marcschink.de>
Sat, 7 Jan 2017 16:43:49 +0000 (17:43 +0100)
committerTomas Vanek <vanekt@fbl.cz>
Wed, 7 Mar 2018 23:42:49 +0000 (23:42 +0000)
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>
src/server/server.c

index 46c860f..6fa864b 100644 (file)
@@ -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);