server: Fix several memory leak while running valgrind on freerdp-shadow
authorzihao.jiang <zihao.jiang@yahoo.com>
Tue, 15 Sep 2015 15:17:22 +0000 (23:17 +0800)
committerzihao.jiang <zihao.jiang@yahoo.com>
Wed, 16 Sep 2015 17:02:22 +0000 (01:02 +0800)
channels/rdpsnd/server/rdpsnd_main.c
libfreerdp/core/server.c
rdtk/librdtk/rdtk_font.c
server/shadow/shadow_server.c

index 7bd0310..93b9fcf 100644 (file)
@@ -782,6 +782,8 @@ void rdpsnd_server_context_free(RdpsndServerContext* context)
 
        free(context->client_formats);
 
+       free(context->priv);
+
        free(context);
 }
 
index 0806ab8..625585e 100644 (file)
@@ -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;
 
index 2d81ccd..b8d9575 100644 (file)
@@ -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)
index 33e9774..a2689c3 100644 (file)
@@ -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,33 +652,33 @@ 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;
-       }
+       shadow_subsystem_uninit(server->subsystem);
 
-       if (server->CertificateFile)
-       {
-               free(server->CertificateFile);
-               server->CertificateFile = NULL;
-       }
-       
-       if (server->PrivateKeyFile)
-       {
-               free(server->PrivateKeyFile);
-               server->PrivateKeyFile = NULL;
-       }
+       shadow_subsystem_free(server->subsystem);
 
-       if (server->ipcSocket)
-       {
-               free(server->ipcSocket);
-               server->ipcSocket = NULL;
-       }
+       freerdp_listener_free(server->listener);
+       server->listener = NULL;
 
-       shadow_subsystem_uninit(server->subsystem);
+       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);
 }