Mike McCormack : msi: Defer package deletion until after the database is closed.

Alexandre Julliard julliard at wine.codeweavers.com
Tue Nov 14 05:14:28 CST 2006


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

Author: Mike McCormack <mike at codeweavers.com>
Date:   Tue Nov 14 12:42:50 2006 +0900

msi: Defer package deletion until after the database is closed.

---

 dlls/msi/package.c |   30 ++++++++++++++++--------------
 1 files changed, 16 insertions(+), 14 deletions(-)

diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index 1455c6d..6f3815f 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -54,11 +54,10 @@ static void MSI_FreePackage( MSIOBJECTHD
 
     if( package->dialog )
         msi_dialog_destroy( package->dialog );
-    ACTION_free_package_structures(package);
-
-    msi_free_properties( package );
 
     msiobj_release( &package->db->hdr );
+    ACTION_free_package_structures(package);
+    msi_free_properties( package );
 }
 
 static UINT clone_properties( MSIPACKAGE *package )
@@ -548,15 +547,16 @@ LPCWSTR msi_download_file( LPCWSTR szUrl
 
 UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
 {
+    static const WCHAR OriginalDatabase[] =
+        {'O','r','i','g','i','n','a','l','D','a','t','a','b','a','s','e',0};
+    static const WCHAR Database[] = {'D','A','T','A','B','A','S','E',0};
     MSIDATABASE *db = NULL;
     MSIPACKAGE *package;
     MSIHANDLE handle;
     LPWSTR ptr, base_url = NULL;
     UINT r;
-
-    static const WCHAR OriginalDatabase[] =
-        {'O','r','i','g','i','n','a','l','D','a','t','a','b','a','s','e',0};
-    static const WCHAR Database[] = {'D','A','T','A','B','A','S','E',0};
+    WCHAR temppath[MAX_PATH];
+    LPCWSTR file = szPackage;
 
     TRACE("%s %p\n", debugstr_w(szPackage), pPackage);
 
@@ -569,9 +569,6 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage,
     }
     else
     {
-        WCHAR temppath[MAX_PATH];
-        LPCWSTR file;
-
         if ( UrlIsW( szPackage, URLIS_URL ) )
         {
             file = msi_download_file( szPackage, temppath );
@@ -587,14 +584,12 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage,
             file = copy_package_to_temp( szPackage, temppath );
 
         r = MSI_OpenDatabaseW( file, MSIDBOPEN_READONLY, &db );
-
-        if (file != szPackage)
-            DeleteFileW( file );
-
         if( r != ERROR_SUCCESS )
         {
             if (GetLastError() == ERROR_FILE_NOT_FOUND)
                 msi_ui_error( 4, MB_OK | MB_ICONWARNING );
+            if (file != szPackage)
+                DeleteFileW( file );
 
             return r;
         }
@@ -604,7 +599,14 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage,
     msi_free( base_url );
     msiobj_release( &db->hdr );
     if( !package )
+    {
+        if (file != szPackage)
+            DeleteFileW( file );
         return ERROR_FUNCTION_FAILED;
+    }
+
+    if( file != szPackage )
+        track_tempfile( package, file );
 
     if( szPackage[0] != '#' )
     {




More information about the wine-cvs mailing list