From: Marc-André Moreau Date: Fri, 25 Jan 2013 22:52:37 +0000 (-0500) Subject: libfreerdp-core: fix memory leaks X-Git-Tag: 1.1.0-beta1~70^2~13 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=e1d0fad519c13f3b39ce09fa27292da05518d927;p=platform%2Fupstream%2Ffreerdp.git libfreerdp-core: fix memory leaks --- diff --git a/client/X11/xfreerdp.c b/client/X11/xfreerdp.c index 4bae7d3..1040290 100644 --- a/client/X11/xfreerdp.c +++ b/client/X11/xfreerdp.c @@ -1249,6 +1249,7 @@ int main(int argc, char* argv[]) instance->context_size = sizeof(xfContext); instance->ContextNew = (pContextNew) xf_context_new; instance->ContextFree = (pContextFree) xf_context_free; + //instance->flags = FREERDP_FLAG_ASYNC_UPDATE; freerdp_context_new(instance); instance->context->argc = argc; diff --git a/client/common/compatibility.c b/client/common/compatibility.c index 9730215..f89860b 100644 --- a/client/common/compatibility.c +++ b/client/common/compatibility.c @@ -341,6 +341,9 @@ int freerdp_detect_old_command_line_syntax(int argc, char** argv, int* count) detect_status = 1; } + if (settings->ServerHostname) + free(settings->ServerHostname); + free(settings); return detect_status; diff --git a/include/freerdp/freerdp.h b/include/freerdp/freerdp.h index 22343fe..1f200e2 100644 --- a/include/freerdp/freerdp.h +++ b/include/freerdp/freerdp.h @@ -103,6 +103,8 @@ struct rdp_context UINT32 paddingC[64 - 41]; /* 41 */ }; +#define FREERDP_FLAG_ASYNC_UPDATE 0x00000001 + /** Defines the options for a given instance of RDP connection. * This is built by the client and given to the FreeRDP library to create the connection * with the expected options. @@ -118,8 +120,11 @@ struct rdp_freerdp When using this capability, client application should ALWAYS declare their structure with the rdpContext field first, and any additional content following it. Can be allocated by a call to freerdp_context_new(). - Must be dealocated by a call to freerdp_context_free() before deallocating the current instance. */ - UINT32 paddingA[16 - 1]; /* 1 */ + Must be deallocated by a call to freerdp_context_free() before deallocating the current instance. */ + + UINT32 flags; /**< (offset 1) context flags, can be set prior to freerdp_context_new() */ + + UINT32 paddingA[16 - 2]; /* 2 */ rdpInput* input; /* (offset 16) Input handle for the connection. diff --git a/libfreerdp/codec/rfx_sse2.c b/libfreerdp/codec/rfx_sse2.c index 72b0570..ac7e1f2 100644 --- a/libfreerdp/codec/rfx_sse2.c +++ b/libfreerdp/codec/rfx_sse2.c @@ -155,7 +155,7 @@ rfx_dwt_2d_decode_block_horiz_sse2(INT16* l, INT16* h, INT16* dst, int subband_w for (y = 0; y < subband_width; y++) { /* Even coefficients */ - for (n = 0; n < subband_width; n+=8) + for (n = 0; n < subband_width; n += 8) { /* dst[2n] = l[n] - ((h[n-1] + h[n] + 1) >> 1); */ @@ -163,6 +163,7 @@ rfx_dwt_2d_decode_block_horiz_sse2(INT16* l, INT16* h, INT16* dst, int subband_w h_n = _mm_load_si128((__m128i*) h_ptr); h_n_m = _mm_loadu_si128((__m128i*) (h_ptr - 1)); + if (n == 0) { first = _mm_extract_epi16(h_n_m, 1); @@ -177,14 +178,15 @@ rfx_dwt_2d_decode_block_horiz_sse2(INT16* l, INT16* h, INT16* dst, int subband_w _mm_store_si128((__m128i*) l_ptr, dst_n); - l_ptr+=8; - h_ptr+=8; + l_ptr += 8; + h_ptr += 8; } + l_ptr -= subband_width; h_ptr -= subband_width; /* Odd coefficients */ - for (n = 0; n < subband_width; n+=8) + for (n = 0; n < subband_width; n += 8) { /* dst[2n + 1] = (h[n] << 1) + ((dst[2n] + dst[2n + 2]) >> 1); */ @@ -194,6 +196,7 @@ rfx_dwt_2d_decode_block_horiz_sse2(INT16* l, INT16* h, INT16* dst, int subband_w dst_n = _mm_load_si128((__m128i*) (l_ptr)); dst_n_p = _mm_loadu_si128((__m128i*) (l_ptr + 1)); + if (n == subband_width - 8) { last = _mm_extract_epi16(dst_n_p, 6); @@ -211,9 +214,9 @@ rfx_dwt_2d_decode_block_horiz_sse2(INT16* l, INT16* h, INT16* dst, int subband_w _mm_store_si128((__m128i*) dst_ptr, dst1); _mm_store_si128((__m128i*) (dst_ptr + 8), dst2); - l_ptr+=8; - h_ptr+=8; - dst_ptr+=16; + l_ptr += 8; + h_ptr += 8; + dst_ptr += 16; } } } diff --git a/libfreerdp/core/freerdp.c b/libfreerdp/core/freerdp.c index 12ce810..e979977 100644 --- a/libfreerdp/core/freerdp.c +++ b/libfreerdp/core/freerdp.c @@ -309,10 +309,10 @@ freerdp* freerdp_new() freerdp* instance; instance = (freerdp*) malloc(sizeof(freerdp)); - ZeroMemory(instance, sizeof(freerdp)); - if (instance != NULL) + if (instance) { + ZeroMemory(instance, sizeof(freerdp)); instance->context_size = sizeof(rdpContext); instance->SendChannelData = freerdp_send_channel_data; } diff --git a/libfreerdp/core/message.c b/libfreerdp/core/message.c index e6476c0..0e117e0 100644 --- a/libfreerdp/core/message.c +++ b/libfreerdp/core/message.c @@ -42,10 +42,13 @@ static void message_EndPaint(rdpContext* context) static void message_SetBounds(rdpContext* context, rdpBounds* bounds) { - rdpBounds* wParam; + rdpBounds* wParam = NULL; - wParam = (rdpBounds*) malloc(sizeof(rdpBounds)); - CopyMemory(wParam, bounds, sizeof(rdpBounds)); + if (bounds) + { + wParam = (rdpBounds*) malloc(sizeof(rdpBounds)); + CopyMemory(wParam, bounds, sizeof(rdpBounds)); + } MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(Update, SetBounds), (void*) wParam, NULL); @@ -534,8 +537,8 @@ static void message_CacheBrush(rdpContext* context, CACHE_BRUSH_ORDER* cacheBrus wParam = (CACHE_BRUSH_ORDER*) malloc(sizeof(CACHE_BRUSH_ORDER)); CopyMemory(wParam, cacheBrushOrder, sizeof(CACHE_BRUSH_ORDER)); - wParam->data = (BYTE*) malloc(wParam->length); - CopyMemory(wParam->data, cacheBrushOrder->data, wParam->length); + //wParam->data = (BYTE*) malloc(wParam->length); + //CopyMemory(wParam->data, cacheBrushOrder->data, wParam->length); MessageQueue_Post(context->update->queue, (void*) context, MakeMessageId(SecondaryUpdate, CacheBrush), (void*) wParam, NULL); @@ -1126,7 +1129,8 @@ int message_process_update_class(rdpMessage* update, wMessage* msg, int type) case Update_SetBounds: IFCALL(update->SetBounds, msg->context, (rdpBounds*) msg->wParam); - free(msg->wParam); + if (msg->wParam) + free(msg->wParam); break; case Update_Synchronize: @@ -1367,7 +1371,7 @@ int message_process_secondary_update_class(rdpMessage* update, wMessage* msg, in { CACHE_BITMAP_V2_ORDER* wParam = (CACHE_BITMAP_V2_ORDER*) msg->wParam; - free(wParam->bitmapDataStream); + //free(wParam->bitmapDataStream); free(wParam); } break; @@ -1423,7 +1427,7 @@ int message_process_secondary_update_class(rdpMessage* update, wMessage* msg, in { CACHE_BRUSH_ORDER* wParam = (CACHE_BRUSH_ORDER*) msg->wParam; - free(wParam->data); + //free(wParam->data); free(wParam); } break; diff --git a/libfreerdp/core/transport.c b/libfreerdp/core/transport.c index a0ed909..a0e06e1 100644 --- a/libfreerdp/core/transport.c +++ b/libfreerdp/core/transport.c @@ -678,10 +678,6 @@ int transport_check_fds(rdpTransport** ptransport) return 0; /* Packet is not yet completely received. */ } - /* - * A complete packet has been received. In case there are trailing data - * for the next packet, we copy it to the new receive buffer. - */ received = transport->ReceiveBuffer; transport->ReceiveBuffer = transport_receive_pool_take(transport); @@ -697,11 +693,9 @@ int transport_check_fds(rdpTransport** ptransport) * 1: asynchronous return */ - ReferenceTable_Add(transport->ReceiveReferences, received); - recv_status = transport->ReceiveCallback(transport, received, transport->ReceiveExtra); - ReferenceTable_Release(transport->ReceiveReferences, received); + transport_receive_pool_return(transport, received); if (recv_status < 0) status = -1; @@ -749,7 +743,9 @@ STREAM* transport_receive_pool_take(rdpTransport* transport) pdu = Queue_Dequeue(transport->ReceivePool); if (!pdu) + { pdu = stream_new(BUFFER_SIZE); + } pdu->p = pdu->data; @@ -778,8 +774,13 @@ rdpTransport* transport_new(rdpSettings* settings) /* a small 0.1ms delay when transport is blocking. */ transport->SleepInterval = 100; + transport->ReceivePool = Queue_New(TRUE, -1, -1); + transport->ReceiveQueue = Queue_New(TRUE, -1, -1); + Queue_Object(transport->ReceivePool)->fnObjectFree = (OBJECT_FREE_FN) stream_free; + Queue_Object(transport->ReceiveQueue)->fnObjectFree = (OBJECT_FREE_FN) stream_free; + /* receive buffer for non-blocking read. */ - transport->ReceiveBuffer = stream_new(BUFFER_SIZE); + transport->ReceiveBuffer = transport_receive_pool_take(transport); transport->ReceiveEvent = CreateEvent(NULL, TRUE, FALSE, NULL); /* buffers for blocking read/write */ @@ -789,14 +790,6 @@ rdpTransport* transport_new(rdpSettings* settings) transport->blocking = TRUE; transport->layer = TRANSPORT_LAYER_TCP; - - transport->ReceivePool = Queue_New(TRUE, -1, -1); - transport->ReceiveQueue = Queue_New(TRUE, -1, -1); - Queue_Object(transport->ReceivePool)->fnObjectFree = (OBJECT_FREE_FN) stream_free; - Queue_Object(transport->ReceiveQueue)->fnObjectFree = (OBJECT_FREE_FN) stream_free; - - transport->ReceiveReferences = ReferenceTable_New(TRUE, - (void*) transport, (REFERENCE_FREE) transport_receive_pool_return); } return transport; @@ -806,7 +799,9 @@ void transport_free(rdpTransport* transport) { if (transport != NULL) { - stream_free(transport->ReceiveBuffer); + if (transport->ReceiveBuffer) + stream_free(transport->ReceiveBuffer); + stream_free(transport->ReceiveStream); stream_free(transport->SendStream); CloseHandle(transport->ReceiveEvent); @@ -827,8 +822,6 @@ void transport_free(rdpTransport* transport) Queue_Free(transport->ReceivePool); Queue_Free(transport->ReceiveQueue); - ReferenceTable_Free(transport->ReceiveReferences); - free(transport); } } diff --git a/libfreerdp/core/transport.h b/libfreerdp/core/transport.h index 92ec3b0..cca3d09 100644 --- a/libfreerdp/core/transport.h +++ b/libfreerdp/core/transport.h @@ -69,8 +69,6 @@ struct rdp_transport wQueue* ReceivePool; wQueue* ReceiveQueue; - - wReferenceTable* ReceiveReferences; }; STREAM* transport_recv_stream_init(rdpTransport* transport, int size); diff --git a/libfreerdp/core/update.c b/libfreerdp/core/update.c index dedae10..051047d 100644 --- a/libfreerdp/core/update.c +++ b/libfreerdp/core/update.c @@ -764,7 +764,7 @@ rdpUpdate* update_new(rdpRdp* rdp) update->SuppressOutput = update_send_suppress_output; update->initialState = TRUE; - //update->asynchronous = TRUE; + update->asynchronous = (rdp->instance->flags & FREERDP_FLAG_ASYNC_UPDATE) ? TRUE : FALSE; if (update->asynchronous) { diff --git a/libfreerdp/crypto/tls.c b/libfreerdp/crypto/tls.c index af43025..55f2c58 100644 --- a/libfreerdp/crypto/tls.c +++ b/libfreerdp/crypto/tls.c @@ -723,6 +723,12 @@ void tls_free(rdpTls* tls) if (tls->PublicKey) free(tls->PublicKey); + if (tls->Bindings) + { + free(tls->Bindings->Bindings); + free(tls->Bindings); + } + certificate_store_free(tls->certificate_store); free(tls); diff --git a/libfreerdp/gdi/32bpp.c b/libfreerdp/gdi/32bpp.c index c604c9e..fadefe9 100644 --- a/libfreerdp/gdi/32bpp.c +++ b/libfreerdp/gdi/32bpp.c @@ -169,7 +169,7 @@ static int BitBlt_SRCCOPY_32bpp(HGDI_DC hdcDest, int nXDest, int nYDest, int nWi dstp = gdi_get_bitmap_pointer(hdcDest, nXDest, nYDest + y); if (srcp != 0 && dstp != 0) - memcpy(dstp, srcp, nWidth * hdcDest->bytesPerPixel); + memmove(dstp, srcp, nWidth * hdcDest->bytesPerPixel); } return 0; diff --git a/libfreerdp/gdi/gdi.c b/libfreerdp/gdi/gdi.c index 37ea823..96719af 100644 --- a/libfreerdp/gdi/gdi.c +++ b/libfreerdp/gdi/gdi.c @@ -980,7 +980,9 @@ void gdi_free(freerdp* instance) gdi_bitmap_free_ex(gdi->tile); gdi_bitmap_free_ex(gdi->image); gdi_DeleteDC(gdi->hdc); - rfx_context_free((RFX_CONTEXT*)gdi->rfx_context); + rfx_context_free((RFX_CONTEXT*) gdi->rfx_context); + nsc_context_free((NSC_CONTEXT*) gdi->nsc_context); + free(gdi->clrconv->palette); free(gdi->clrconv); free(gdi); } diff --git a/libfreerdp/gdi/graphics.c b/libfreerdp/gdi/graphics.c index d30a230..2ef87d2 100644 --- a/libfreerdp/gdi/graphics.c +++ b/libfreerdp/gdi/graphics.c @@ -244,8 +244,8 @@ void gdi_Glyph_BeginDraw(rdpContext* context, int x, int y, int width, int heigh gdi_CRgnToRect(x, y, width, height, &rect); brush = gdi_CreateSolidBrush(fgcolor); - gdi_FillRect(gdi->drawing->hdc, &rect, brush); + gdi_DeleteObject((HGDIOBJECT) brush); gdi->textColor = gdi_SetTextColor(gdi->drawing->hdc, bgcolor); }