Fixed memory leak in pointer free.

This commit is contained in:
Armin Novak 2016-10-10 10:26:54 +02:00
parent e54c504eaa
commit bc69730863
2 changed files with 42 additions and 48 deletions

View File

@ -33,11 +33,33 @@
#define TAG FREERDP_TAG("cache.pointer")
static void pointer_cache_put(rdpPointerCache* pointer_cache, UINT32 index,
static BOOL pointer_cache_put(rdpPointerCache* pointer_cache, UINT32 index,
rdpPointer* pointer);
static const rdpPointer* pointer_cache_get(rdpPointerCache* pointer_cache,
UINT32 index);
static void pointer_free(rdpContext* context, rdpPointer* pointer)
{
if (pointer)
{
pointer->Free(context, pointer);
if (pointer->xorMaskData)
{
free(pointer->xorMaskData);
pointer->xorMaskData = NULL;
}
if (pointer->andMaskData)
{
free(pointer->andMaskData);
pointer->andMaskData = NULL;
}
free(pointer);
}
}
static BOOL update_pointer_position(rdpContext* context,
const POINTER_POSITION_UPDATE* pointer_position)
{
@ -119,17 +141,18 @@ static BOOL update_pointer_color(rdpContext* context,
pointer->lengthXorMask);
}
pointer->New(context, pointer);
pointer_cache_put(cache->pointer, pointer_color->cacheIndex, pointer);
pointer->Set(context, pointer);
return TRUE;
if (!pointer->New(context, pointer))
goto out_fail;
if (!pointer_cache_put(cache->pointer, pointer_color->cacheIndex, pointer))
goto out_fail;
return pointer->Set(context, pointer);
}
return FALSE;
out_fail:
free(pointer->andMaskData);
free(pointer->xorMaskData);
free(pointer);
pointer_free(context, pointer);
return FALSE;
}
@ -181,13 +204,13 @@ static BOOL update_pointer_new(rdpContext* context,
if (!pointer->New(context, pointer))
goto out_fail;
pointer_cache_put(cache->pointer, pointer_new->colorPtrAttr.cacheIndex,
pointer);
if (!pointer_cache_put(cache->pointer, pointer_new->colorPtrAttr.cacheIndex,
pointer))
goto out_fail;
return pointer->Set(context, pointer);
out_fail:
free(pointer->andMaskData);
free(pointer->xorMaskData);
free(pointer);
pointer_free(context, pointer);
return FALSE;
}
@ -222,7 +245,7 @@ const rdpPointer* pointer_cache_get(rdpPointerCache* pointer_cache,
return pointer;
}
void pointer_cache_put(rdpPointerCache* pointer_cache, UINT32 index,
BOOL pointer_cache_put(rdpPointerCache* pointer_cache, UINT32 index,
rdpPointer* pointer)
{
rdpPointer* prevPointer;
@ -230,15 +253,13 @@ void pointer_cache_put(rdpPointerCache* pointer_cache, UINT32 index,
if (index >= pointer_cache->cacheSize)
{
WLog_ERR(TAG, "invalid pointer index:%d", index);
return;
return FALSE;
}
prevPointer = pointer_cache->entries[index];
if (prevPointer != NULL)
prevPointer->Free(pointer_cache->update->context, prevPointer);
pointer_free(pointer_cache->update->context, prevPointer);
pointer_cache->entries[index] = pointer;
return TRUE;
}
void pointer_cache_register_callbacks(rdpUpdate* update)
@ -284,12 +305,7 @@ void pointer_cache_free(rdpPointerCache* pointer_cache)
for (i = 0; i < pointer_cache->cacheSize; i++)
{
pointer = pointer_cache->entries[i];
if (pointer != NULL)
{
pointer->Free(pointer_cache->update->context, pointer);
pointer_cache->entries[i] = NULL;
}
pointer_free(pointer_cache->update->context, pointer);
}
free(pointer_cache->entries);

View File

@ -126,28 +126,6 @@ static BOOL Pointer_New(rdpContext* context, rdpPointer* pointer)
return TRUE;
}
static void Pointer_Free(rdpContext* context, rdpPointer* pointer)
{
if (pointer)
{
pointer->Free(context, pointer);
if (pointer->xorMaskData)
{
free(pointer->xorMaskData);
pointer->xorMaskData = NULL;
}
if (pointer->andMaskData)
{
free(pointer->andMaskData);
pointer->andMaskData = NULL;
}
free(pointer);
}
}
/* static method */
void graphics_register_pointer(rdpGraphics* graphics, rdpPointer* pointer)
{
@ -238,7 +216,7 @@ rdpGraphics* graphics_new(rdpContext* context)
graphics->Pointer_Prototype->size = sizeof(rdpPointer);
graphics->Pointer_Prototype->New = Pointer_New;
graphics->Pointer_Prototype->Free = Pointer_Free;
graphics->Pointer_Prototype->Free = NULL;
graphics->Glyph_Prototype = (rdpGlyph*) calloc(1, sizeof(rdpGlyph));
if (!graphics->Glyph_Prototype)