[PATCH 1/2] msi: Fix a couple of memory leaks (Valgrind).

Hans Leidekker hans at codeweavers.com
Mon Oct 1 10:01:48 CDT 2018


Signed-off-by: Hans Leidekker <hans at codeweavers.com>
---
 dlls/msi/install.c | 7 ++++---
 dlls/msi/package.c | 4 ++++
 dlls/msi/streams.c | 2 +-
 3 files changed, 9 insertions(+), 4 deletions(-)

diff --git a/dlls/msi/install.c b/dlls/msi/install.c
index ce36bd3335..2cdebd2ad3 100644
--- a/dlls/msi/install.c
+++ b/dlls/msi/install.c
@@ -411,8 +411,7 @@ WCHAR *msi_resolve_source_folder( MSIPACKAGE *package, const WCHAR *name, MSIFOL
 UINT WINAPI MsiGetSourcePathA(MSIHANDLE hinst, const char *folder, char *buf, DWORD *sz)
 {
     MSIPACKAGE *package;
-    const WCHAR *path;
-    WCHAR *folderW;
+    WCHAR *path, *folderW;
     UINT r;
 
     TRACE("%s %p %p\n", debugstr_a(folder), buf, sz);
@@ -459,6 +458,7 @@ UINT WINAPI MsiGetSourcePathA(MSIHANDLE hinst, const char *folder, char *buf, DW
     else
         r = ERROR_DIRECTORY;
 
+    heap_free(path);
     heap_free(folderW);
     msiobj_release(&package->hdr);
     return r;
@@ -470,7 +470,7 @@ UINT WINAPI MsiGetSourcePathA(MSIHANDLE hinst, const char *folder, char *buf, DW
 UINT WINAPI MsiGetSourcePathW(MSIHANDLE hinst, const WCHAR *folder, WCHAR *buf, DWORD *sz)
 {
     MSIPACKAGE *package;
-    const WCHAR *path;
+    WCHAR *path;
     UINT r;
 
     TRACE("%s %p %p\n", debugstr_w(folder), buf, sz);
@@ -510,6 +510,7 @@ UINT WINAPI MsiGetSourcePathW(MSIHANDLE hinst, const WCHAR *folder, WCHAR *buf,
     else
         r = ERROR_DIRECTORY;
 
+    heap_free(path);
     msiobj_release(&package->hdr);
     return r;
 }
diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index 8e9ae6dd90..39a0a939b7 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -2125,6 +2125,7 @@ INT WINAPI MsiProcessMessage( MSIHANDLE hInstall, INSTALLMESSAGE eMessageType,
 
     ret = MSI_ProcessMessage( package, eMessageType, record );
 
+    msiobj_release( &record->hdr );
     msiobj_release( &package->hdr );
     return ret;
 }
@@ -2689,7 +2690,10 @@ UINT __cdecl s_remote_FormatRecord(MSIHANDLE hinst, struct wire_record *remote_r
     {
         *value = midl_user_allocate(++size * sizeof(WCHAR));
         if (!*value)
+        {
+            MsiCloseHandle(rec);
             return ERROR_OUTOFMEMORY;
+        }
         r = MsiFormatRecordW(hinst, rec, *value, &size);
     }
 
diff --git a/dlls/msi/streams.c b/dlls/msi/streams.c
index 7f9582cd4b..74ef899c1b 100644
--- a/dlls/msi/streams.c
+++ b/dlls/msi/streams.c
@@ -141,9 +141,9 @@ static UINT STREAMS_set_row(struct tagMSIVIEW *view, UINT row, MSIRECORD *rec, U
 
         old = sv->db->streams[row].stream;
         hr = IStream_QueryInterface( new, &IID_IStream, (void **)&sv->db->streams[row].stream );
+        IStream_Release( new );
         if (FAILED( hr ))
         {
-            IStream_Release( new );
             return ERROR_FUNCTION_FAILED;
         }
         if (old) IStream_Release( old );
-- 
2.11.0




More information about the wine-devel mailing list