libfreerdp-core: fix memory leaks
authorMarc-André Moreau <marcandre.moreau@gmail.com>
Fri, 25 Jan 2013 22:52:37 +0000 (17:52 -0500)
committerMarc-André Moreau <marcandre.moreau@gmail.com>
Fri, 25 Jan 2013 22:52:37 +0000 (17:52 -0500)
13 files changed:
client/X11/xfreerdp.c
client/common/compatibility.c
include/freerdp/freerdp.h
libfreerdp/codec/rfx_sse2.c
libfreerdp/core/freerdp.c
libfreerdp/core/message.c
libfreerdp/core/transport.c
libfreerdp/core/transport.h
libfreerdp/core/update.c
libfreerdp/crypto/tls.c
libfreerdp/gdi/32bpp.c
libfreerdp/gdi/gdi.c
libfreerdp/gdi/graphics.c

index 4bae7d3..1040290 100644 (file)
@@ -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;
index 9730215..f89860b 100644 (file)
@@ -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;
index 22343fe..1f200e2 100644 (file)
@@ -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.
index 72b0570..ac7e1f2 100644 (file)
@@ -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;
                }
        }
 }
index 12ce810..e979977 100644 (file)
@@ -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;
        }
index e6476c0..0e117e0 100644 (file)
@@ -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;
index a0ed909..a0e06e1 100644 (file)
@@ -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);
        }
 }
index 92ec3b0..cca3d09 100644 (file)
@@ -69,8 +69,6 @@ struct rdp_transport
 
        wQueue* ReceivePool;
        wQueue* ReceiveQueue;
-
-       wReferenceTable* ReceiveReferences;
 };
 
 STREAM* transport_recv_stream_init(rdpTransport* transport, int size);
index dedae10..051047d 100644 (file)
@@ -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)
                {
index af43025..55f2c58 100644 (file)
@@ -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);
index c604c9e..fadefe9 100644 (file)
@@ -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;
index 37ea823..96719af 100644 (file)
@@ -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);
        }
index d30a230..2ef87d2 100644 (file)
@@ -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);
 }