Evan Stade : gdiplus: Fix memory leak in GdipCreateMetafileFromWMF.

Alexandre Julliard julliard at wine.codeweavers.com
Wed Aug 1 05:16:51 CDT 2007


Module: wine
Branch: master
Commit: cfef981a9aeedc7dab3e626aa0aad6b48dcd87b9
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=cfef981a9aeedc7dab3e626aa0aad6b48dcd87b9

Author: Evan Stade <estade at 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)




More information about the wine-cvs mailing list