From 90bd43f26e7db7cccd78679a3feb0c5c14efe72c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marc-Andr=C3=A9=20Moreau?= Date: Wed, 29 Aug 2012 17:50:13 -0400 Subject: [PATCH] wfreerdp: fix memory leaks --- client/Windows/wf_graphics.c | 15 ------- client/Windows/wf_graphics.h | 1 - client/Windows/wfreerdp.c | 85 +++++++++++++++++++----------------- 3 files changed, 45 insertions(+), 56 deletions(-) diff --git a/client/Windows/wf_graphics.c b/client/Windows/wf_graphics.c index 17d0b85c5..2d1d98d9a 100644 --- a/client/Windows/wf_graphics.c +++ b/client/Windows/wf_graphics.c @@ -85,21 +85,6 @@ wfBitmap* wf_image_new(wfInfo* wfi, int width, int height, int bpp, uint8* data) return image; } -wfBitmap* wf_bitmap_new(wfInfo* wfi, int width, int height, int bpp, uint8* data) -{ - HDC hdc; - wfBitmap* bitmap; - - hdc = GetDC(NULL); - bitmap = (wfBitmap*) xmalloc(sizeof(wfBitmap)); - bitmap->hdc = CreateCompatibleDC(hdc); - bitmap->bitmap = wf_create_dib(wfi, width, height, bpp, data, &(bitmap->pdata)); - bitmap->org_bitmap = (HBITMAP) SelectObject(bitmap->hdc, bitmap->bitmap); - ReleaseDC(NULL, hdc); - - return bitmap; -} - void wf_image_free(wfBitmap* image) { if (image != 0) diff --git a/client/Windows/wf_graphics.h b/client/Windows/wf_graphics.h index 024d3f77b..96dfd3513 100644 --- a/client/Windows/wf_graphics.h +++ b/client/Windows/wf_graphics.h @@ -24,7 +24,6 @@ HBITMAP wf_create_dib(wfInfo* wfi, int width, int height, int bpp, uint8* data, uint8** pdata); wfBitmap* wf_image_new(wfInfo* wfi, int width, int height, int bpp, uint8* data); -wfBitmap* wf_bitmap_new(wfInfo* wfi, int width, int height, int bpp, uint8* data); void wf_image_free(wfBitmap* image); void wf_register_graphics(rdpGraphics* graphics); diff --git a/client/Windows/wfreerdp.c b/client/Windows/wfreerdp.c index c6acbbf59..6bc8a59ea 100644 --- a/client/Windows/wfreerdp.c +++ b/client/Windows/wfreerdp.c @@ -153,30 +153,30 @@ boolean wf_pre_connect(freerdp* instance) settings->os_major_type = OSMAJORTYPE_WINDOWS; settings->os_minor_type = OSMINORTYPE_WINDOWS_NT; - settings->order_support[NEG_DSTBLT_INDEX] = true; - settings->order_support[NEG_PATBLT_INDEX] = true; - settings->order_support[NEG_SCRBLT_INDEX] = true; - settings->order_support[NEG_OPAQUE_RECT_INDEX] = true; - settings->order_support[NEG_DRAWNINEGRID_INDEX] = false; - settings->order_support[NEG_MULTIDSTBLT_INDEX] = false; - settings->order_support[NEG_MULTIPATBLT_INDEX] = false; - settings->order_support[NEG_MULTISCRBLT_INDEX] = false; - settings->order_support[NEG_MULTIOPAQUERECT_INDEX] = true; - settings->order_support[NEG_MULTI_DRAWNINEGRID_INDEX] = false; - settings->order_support[NEG_LINETO_INDEX] = true; - settings->order_support[NEG_POLYLINE_INDEX] = true; - settings->order_support[NEG_MEMBLT_INDEX] = true; - settings->order_support[NEG_MEM3BLT_INDEX] = false; - settings->order_support[NEG_SAVEBITMAP_INDEX] = false; - settings->order_support[NEG_GLYPH_INDEX_INDEX] = false; - settings->order_support[NEG_FAST_INDEX_INDEX] = false; - settings->order_support[NEG_FAST_GLYPH_INDEX] = false; - settings->order_support[NEG_POLYGON_SC_INDEX] = false; - settings->order_support[NEG_POLYGON_CB_INDEX] = false; - settings->order_support[NEG_ELLIPSE_SC_INDEX] = false; - settings->order_support[NEG_ELLIPSE_CB_INDEX] = false; + settings->order_support[NEG_DSTBLT_INDEX] = TRUE; + settings->order_support[NEG_PATBLT_INDEX] = TRUE; + settings->order_support[NEG_SCRBLT_INDEX] = TRUE; + settings->order_support[NEG_OPAQUE_RECT_INDEX] = TRUE; + settings->order_support[NEG_DRAWNINEGRID_INDEX] = FALSE; + settings->order_support[NEG_MULTIDSTBLT_INDEX] = FALSE; + settings->order_support[NEG_MULTIPATBLT_INDEX] = FALSE; + settings->order_support[NEG_MULTISCRBLT_INDEX] = FALSE; + settings->order_support[NEG_MULTIOPAQUERECT_INDEX] = TRUE; + settings->order_support[NEG_MULTI_DRAWNINEGRID_INDEX] = FALSE; + settings->order_support[NEG_LINETO_INDEX] = TRUE; + settings->order_support[NEG_POLYLINE_INDEX] = TRUE; + settings->order_support[NEG_MEMBLT_INDEX] = TRUE; + settings->order_support[NEG_MEM3BLT_INDEX] = FALSE; + settings->order_support[NEG_SAVEBITMAP_INDEX] = FALSE; + settings->order_support[NEG_GLYPH_INDEX_INDEX] = FALSE; + settings->order_support[NEG_FAST_INDEX_INDEX] = FALSE; + settings->order_support[NEG_FAST_GLYPH_INDEX] = FALSE; + settings->order_support[NEG_POLYGON_SC_INDEX] = FALSE; + settings->order_support[NEG_POLYGON_CB_INDEX] = FALSE; + settings->order_support[NEG_ELLIPSE_SC_INDEX] = FALSE; + settings->order_support[NEG_ELLIPSE_CB_INDEX] = FALSE; - settings->glyph_cache = false; + settings->glyph_cache = FALSE; wfi->cursor = g_default_cursor; @@ -186,7 +186,7 @@ boolean wf_pre_connect(freerdp* instance) wfi->clrconv = (HCLRCONV) xzalloc(sizeof(CLRCONV)); wfi->clrconv->palette = NULL; - wfi->clrconv->alpha = false; + wfi->clrconv->alpha = FALSE; instance->context->cache = cache_new(settings); @@ -219,7 +219,7 @@ boolean wf_pre_connect(freerdp* instance) settings->kbd_layout = (int) GetKeyboardLayout(0) & 0x0000FFFF; freerdp_channels_pre_connect(instance->context->channels, instance); - return true; + return TRUE; } void cpuid(unsigned info, unsigned *eax, unsigned *ebx, unsigned *ecx, unsigned *edx) @@ -309,12 +309,12 @@ boolean wf_post_connect(freerdp* instance) wfi->hdc->hwnd->cinvalid = (HGDI_RGN) xmalloc(sizeof(GDI_RGN) * wfi->hdc->hwnd->count); wfi->hdc->hwnd->ninvalid = 0; - wfi->image = wf_bitmap_new(wfi, 64, 64, 32, NULL); + wfi->image = wf_image_new(wfi, 64, 64, 32, NULL); wfi->image->_bitmap.data = NULL; if (settings->rfx_codec) { - wfi->tile = wf_bitmap_new(wfi, 64, 64, 32, NULL); + wfi->tile = wf_image_new(wfi, 64, 64, 32, NULL); wfi->rfx_context = rfx_context_new(); rfx_context_set_cpu_opt(wfi->rfx_context, wfi_detect_cpu()); } @@ -377,7 +377,7 @@ boolean wf_post_connect(freerdp* instance) pointer_cache_register_callbacks(instance->update); - if (wfi->sw_gdi != true) + if (wfi->sw_gdi != TRUE) { brush_cache_register_callbacks(instance->update); bitmap_cache_register_callbacks(instance->update); @@ -390,7 +390,7 @@ boolean wf_post_connect(freerdp* instance) wf_cliprdr_init(wfi, instance->context->channels); - return true; + return TRUE; } boolean wf_verify_certificate(freerdp* instance, char* subject, char* issuer, char* fingerprint) @@ -421,7 +421,7 @@ boolean wf_verify_certificate(freerdp* instance, char* subject, char* issuer, ch SetConsoleMode(input_handle, mode); #endif - return true; + return TRUE; } int wf_receive_channel_data(freerdp* instance, int channelId, uint8* data, int size, int flags, int total_size) @@ -441,12 +441,12 @@ void wf_process_channel_event(rdpChannels* channels, freerdp* instance) boolean wf_get_fds(freerdp* instance, void** rfds, int* rcount, void** wfds, int* wcount) { - return true; + return TRUE; } boolean wf_check_fds(freerdp* instance) { - return true; + return TRUE; } int wf_process_plugin_args(rdpSettings* settings, const char* name, RDP_PLUGIN_DATA* plugin_data, void* user_data) @@ -481,7 +481,7 @@ int wfreerdp_run(freerdp* instance) memset(rfds, 0, sizeof(rfds)); memset(wfds, 0, sizeof(wfds)); - if (freerdp_connect(instance) != true) + if (freerdp_connect(instance) != TRUE) return 0; channels = instance->context->channels; @@ -491,17 +491,17 @@ int wfreerdp_run(freerdp* instance) rcount = 0; wcount = 0; - if (freerdp_get_fds(instance, rfds, &rcount, wfds, &wcount) != true) + if (freerdp_get_fds(instance, rfds, &rcount, wfds, &wcount) != TRUE) { printf("Failed to get FreeRDP file descriptor\n"); break; } - if (wf_get_fds(instance, rfds, &rcount, wfds, &wcount) != true) + if (wf_get_fds(instance, rfds, &rcount, wfds, &wcount) != TRUE) { printf("Failed to get wfreerdp file descriptor\n"); break; } - if (freerdp_channels_get_fds(channels, instance, rfds, &rcount, wfds, &wcount) != true) + if (freerdp_channels_get_fds(channels, instance, rfds, &rcount, wfds, &wcount) != TRUE) { printf("Failed to get channel manager file descriptor\n"); break; @@ -532,17 +532,17 @@ int wfreerdp_run(freerdp* instance) break; } - if (freerdp_check_fds(instance) != true) + if (freerdp_check_fds(instance) != TRUE) { printf("Failed to check FreeRDP file descriptor\n"); break; } - if (wf_check_fds(instance) != true) + if (wf_check_fds(instance) != TRUE) { printf("Failed to check wfreerdp file descriptor\n"); break; } - if (freerdp_channels_check_fds(channels, instance) != true) + if (freerdp_channels_check_fds(channels, instance) != TRUE) { printf("Failed to check channel manager file descriptor\n"); break; @@ -569,8 +569,10 @@ int wfreerdp_run(freerdp* instance) } /* cleanup */ + + freerdp_channels_close(channels, instance); freerdp_channels_free(channels); - freerdp_free(instance); + freerdp_disconnect(instance); return 0; } @@ -721,6 +723,9 @@ INT WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine L"Failed to start wfreerdp.\n\nPlease check the debug output.", L"FreeRDP Error", MB_ICONSTOP); + freerdp_context_free(instance); + freerdp_free(instance); + WSACleanup(); #ifdef _DEBUG