Evan Stade : gdiplus: Fix memory leak in GdipCreateMetafileFromWMF.
Module: wine Branch: master Commit: cfef981a9aeedc7dab3e626aa0aad6b48dcd87b9 URL: http://source.winehq.org/git/wine.git/?a=commit;h=cfef981a9aeedc7dab3e626aa0... Author: Evan Stade <estade(a)gmail.com> Date: Tue Jul 31 19:15:12 2007 -0700 gdiplus: Fix memory leak in GdipCreateMetafileFromWMF. --- dlls/gdiplus/graphics.c | 20 ++++++++++++++------ 1 files changed, 14 insertions(+), 6 deletions(-) diff --git a/dlls/gdiplus/graphics.c b/dlls/gdiplus/graphics.c index 80684ff..52d6c5f 100644 --- a/dlls/gdiplus/graphics.c +++ b/dlls/gdiplus/graphics.c @@ -846,11 +846,12 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromWmf(HMETAFILE hwmf, BOOL delete, GDIPCONST WmfPlaceableFileHeader * placeable, GpMetafile **metafile) { static int calls; - IStream *stream; + IStream *stream = NULL; UINT read; BYTE* copy; METAFILEPICT mfp; HENHMETAFILE hemf; + GpStatus retval = GenericError; if(!hwmf || !metafile || !placeable) return InvalidParameter; @@ -882,16 +883,19 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromWmf(HMETAFILE hwmf, BOOL delete, if(CreateStreamOnHGlobal(copy, TRUE, &stream) != S_OK){ ERR("could not make stream\n"); - return GenericError; + goto end; } *metafile = GdipAlloc(sizeof(GpMetafile)); - if(!*metafile) return OutOfMemory; + if(!*metafile){ + retval = OutOfMemory; + goto end; + } if(OleLoadPicture(stream, 0, FALSE, &IID_IPicture, (LPVOID*) &((*metafile)->image.picture)) != S_OK){ GdipFree(*metafile); - return GenericError; + goto end; } (*metafile)->image.type = ImageTypeMetafile; @@ -903,11 +907,15 @@ GpStatus WINGDIPAPI GdipCreateMetafileFromWmf(HMETAFILE hwmf, BOOL delete, - placeable->BoundingBox.Top)) / ((REAL) placeable->Inch); (*metafile)->unit = UnitInch; - if(delete) DeleteMetaFile(hwmf); - return Ok; + retval = Ok; + +end: + IStream_Release(stream); + GdipFree(copy); + return retval; } GpStatus WINGDIPAPI GdipDeleteGraphics(GpGraphics *graphics)
participants (1)
-
Alexandre Julliard