libfreerdp-core: fix memory leaks

This commit is contained in:
Marc-André Moreau 2013-01-25 17:52:37 -05:00
parent f3d4da3cf9
commit e1d0fad519
13 changed files with 59 additions and 44 deletions

View 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;

View 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;

View 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.

View 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;
}
}
}

View 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;
}

View File

@ -42,10 +42,13 @@ static void message_EndPaint(rdpContext* context)
static void message_SetBounds(rdpContext* context, rdpBounds* bounds)
{
rdpBounds* wParam;
rdpBounds* wParam = NULL;
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,6 +1129,7 @@ int message_process_update_class(rdpMessage* update, wMessage* msg, int type)
case Update_SetBounds:
IFCALL(update->SetBounds, msg->context, (rdpBounds*) msg->wParam);
if (msg->wParam)
free(msg->wParam);
break;
@ -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;

View 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)
{
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);
}
}

View File

@ -69,8 +69,6 @@ struct rdp_transport
wQueue* ReceivePool;
wQueue* ReceiveQueue;
wReferenceTable* ReceiveReferences;
};
STREAM* transport_recv_stream_init(rdpTransport* transport, int size);

View 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)
{

View 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);

View 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;

View 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);
}

View 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);
}