From f21749ac07946aa129c4b7cbf616db79cac09ef0 Mon Sep 17 00:00:00 2001 From: "zihao.jiang" Date: Tue, 15 Sep 2015 23:17:22 +0800 Subject: [PATCH] server: Fix several memory leak while running valgrind on freerdp-shadow --- channels/rdpsnd/server/rdpsnd_main.c | 2 + libfreerdp/core/server.c | 1 - rdtk/librdtk/rdtk_font.c | 9 ++++- server/shadow/shadow_server.c | 60 +++++++++++++--------------- 4 files changed, 37 insertions(+), 35 deletions(-) diff --git a/channels/rdpsnd/server/rdpsnd_main.c b/channels/rdpsnd/server/rdpsnd_main.c index 7bd0310b0..93b9fcfc1 100644 --- a/channels/rdpsnd/server/rdpsnd_main.c +++ b/channels/rdpsnd/server/rdpsnd_main.c @@ -782,6 +782,8 @@ void rdpsnd_server_context_free(RdpsndServerContext* context) free(context->client_formats); + free(context->priv); + free(context); } diff --git a/libfreerdp/core/server.c b/libfreerdp/core/server.c index 0806ab820..625585e94 100644 --- a/libfreerdp/core/server.c +++ b/libfreerdp/core/server.c @@ -983,7 +983,6 @@ HANDLE WINAPI FreeRDP_WTSVirtualChannelOpen(HANDLE hServer, DWORD SessionId, LPS goto error_receiveData; } channel->queue = MessageQueue_New(NULL); - channel->queue = MessageQueue_New(NULL); if (!channel->queue) goto error_queue; diff --git a/rdtk/librdtk/rdtk_font.c b/rdtk/librdtk/rdtk_font.c index 2d81ccdda..b8d957554 100644 --- a/rdtk/librdtk/rdtk_font.c +++ b/rdtk/librdtk/rdtk_font.c @@ -710,7 +710,14 @@ rdtkFont* rdtk_embedded_font_new(rdtkEngine* engine, BYTE* imageData, int imageS void rdtk_font_free(rdtkFont* font) { - free(font); + if (font) + { + free(font->family); + free(font->style); + winpr_image_free(font->image, TRUE); + free(font->glyphs); + free(font); + } } int rdtk_font_engine_init(rdtkEngine* engine) diff --git a/server/shadow/shadow_server.c b/server/shadow/shadow_server.c index 33e97743e..a2689c370 100644 --- a/server/shadow/shadow_server.c +++ b/server/shadow/shadow_server.c @@ -625,6 +625,7 @@ int shadow_server_init(rdpShadowServer* server) if (status >= 0) return status; + shadow_subsystem_free(server->subsystem); fail_subsystem_new: freerdp_listener_free(server->listener); server->listener = NULL; @@ -651,34 +652,34 @@ fail_client_array: int shadow_server_uninit(rdpShadowServer* server) { + if (!server) + return -1; + shadow_server_stop(server); - if (server->listener) - { - freerdp_listener_free(server->listener); - server->listener = NULL; - } - - if (server->CertificateFile) - { - free(server->CertificateFile); - server->CertificateFile = NULL; - } - - if (server->PrivateKeyFile) - { - free(server->PrivateKeyFile); - server->PrivateKeyFile = NULL; - } - - if (server->ipcSocket) - { - free(server->ipcSocket); - server->ipcSocket = NULL; - } - shadow_subsystem_uninit(server->subsystem); + shadow_subsystem_free(server->subsystem); + + freerdp_listener_free(server->listener); + server->listener = NULL; + + free(server->CertificateFile); + server->CertificateFile = NULL; + free(server->PrivateKeyFile); + server->PrivateKeyFile = NULL; + + free(server->ConfigPath); + server->ConfigPath = NULL; + + DeleteCriticalSection(&(server->lock)); + + CloseHandle(server->StopEvent); + server->StopEvent = NULL; + + ArrayList_Free(server->clients); + server->clients = NULL; + return 1; } @@ -705,15 +706,8 @@ void shadow_server_free(rdpShadowServer* server) if (!server) return; - DeleteCriticalSection(&(server->lock)); - - if (server->clients) - { - ArrayList_Free(server->clients); - server->clients = NULL; - } - - shadow_subsystem_free(server->subsystem); + free(server->ipcSocket); + server->ipcSocket = NULL; free(server); }