Alexandre Julliard : fusion: Fix a number of leaks in assembly_create.

Alexandre Julliard julliard at winehq.org
Wed Apr 16 08:09:46 CDT 2008


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

Author: Alexandre Julliard <julliard at winehq.org>
Date:   Wed Apr 16 13:51:17 2008 +0200

fusion: Fix a number of leaks in assembly_create.

---

 dlls/fusion/assembly.c |   36 ++++++++++++++++++++++++------------
 1 files changed, 24 insertions(+), 12 deletions(-)

diff --git a/dlls/fusion/assembly.c b/dlls/fusion/assembly.c
index d3512e7..024e611 100644
--- a/dlls/fusion/assembly.c
+++ b/dlls/fusion/assembly.c
@@ -343,40 +343,52 @@ HRESULT assembly_create(ASSEMBLY **out, LPCWSTR file)
 
     *out = NULL;
 
-    assembly = HeapAlloc(GetProcessHeap(), 0, sizeof(ASSEMBLY));
+    assembly = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(ASSEMBLY));
     if (!assembly)
         return E_OUTOFMEMORY;
 
-    ZeroMemory(assembly, sizeof(ASSEMBLY));
-
     assembly->path = strdupWtoA(file);
     if (!assembly->path)
-        return E_OUTOFMEMORY;
+    {
+        hr = E_OUTOFMEMORY;
+        goto failed;
+    }
 
     assembly->hfile = CreateFileW(file, GENERIC_READ, FILE_SHARE_READ,
                                   NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
-    if (!assembly->hfile)
-        return HRESULT_FROM_WIN32(GetLastError());
+    if (assembly->hfile == INVALID_HANDLE_VALUE)
+    {
+        hr = HRESULT_FROM_WIN32(GetLastError());
+        goto failed;
+    }
 
     assembly->hmap = CreateFileMappingW(assembly->hfile, NULL, PAGE_READONLY,
                                         0, 0, NULL);
     if (!assembly->hmap)
-        return HRESULT_FROM_WIN32(GetLastError());
+    {
+        hr = HRESULT_FROM_WIN32(GetLastError());
+        goto failed;
+    }
 
     assembly->data = MapViewOfFile(assembly->hmap, FILE_MAP_READ, 0, 0, 0);
     if (!assembly->data)
-        return HRESULT_FROM_WIN32(GetLastError());
+    {
+        hr = HRESULT_FROM_WIN32(GetLastError());
+        goto failed;
+    }
 
     hr = parse_pe_header(assembly);
-    if (FAILED(hr))
-        return hr;
+    if (FAILED(hr)) goto failed;
 
     hr = parse_clr_metadata(assembly);
-    if (FAILED(hr))
-        return hr;
+    if (FAILED(hr)) goto failed;
 
     *out = assembly;
     return S_OK;
+
+failed:
+    assembly_release( assembly );
+    return hr;
 }
 
 HRESULT assembly_release(ASSEMBLY *assembly)




More information about the wine-cvs mailing list