[1/3] msi: Set the OriginalDatabase property after applying transforms, not before.

Hans Leidekker hans at codeweavers.com
Mon Jan 21 09:24:11 CST 2013


Fixes http://bugs.winehq.org/show_bug.cgi?id=32764
---
 dlls/msi/action.c        |    1 +
 dlls/msi/msipriv.h       |    1 +
 dlls/msi/package.c       |   39 ++++++++++++++++++++++++++++-----------
 dlls/msi/tests/package.c |    2 +-
 4 files changed, 31 insertions(+), 12 deletions(-)

diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index 22fa388..5abe040 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -7790,6 +7790,7 @@ UINT MSI_InstallPackage( MSIPACKAGE *package, LPCWSTR szPackagePath,
 
     /* properties may have been added by a transform */
     msi_clone_properties( package );
+    msi_set_original_database_property( package->db, szPackagePath );
 
     msi_parse_command_line( package, szCommandLine, FALSE );
     msi_adjust_privilege_properties( package );
diff --git a/dlls/msi/msipriv.h b/dlls/msi/msipriv.h
index a3e1e0d..f709bac 100644
--- a/dlls/msi/msipriv.h
+++ b/dlls/msi/msipriv.h
@@ -1041,6 +1041,7 @@ extern BOOL msi_init_assembly_caches(MSIPACKAGE *) DECLSPEC_HIDDEN;
 extern void msi_destroy_assembly_caches(MSIPACKAGE *) DECLSPEC_HIDDEN;
 extern WCHAR *msi_font_version_from_file(const WCHAR *) DECLSPEC_HIDDEN;
 extern WCHAR **msi_split_string(const WCHAR *, WCHAR) DECLSPEC_HIDDEN;
+extern UINT msi_set_original_database_property(MSIDATABASE *, const WCHAR *) DECLSPEC_HIDDEN;
 
 /* media */
 
diff --git a/dlls/msi/package.c b/dlls/msi/package.c
index 3055175..f8f818d 100644
--- a/dlls/msi/package.c
+++ b/dlls/msi/package.c
@@ -1510,6 +1510,28 @@ static UINT get_local_package( const WCHAR *filename, WCHAR *localfile )
     return r;
 }
 
+UINT msi_set_original_database_property( MSIDATABASE *db, const WCHAR *package )
+{
+    UINT r;
+
+    if (UrlIsW( package, URLIS_URL ))
+        r = msi_set_property( db, szOriginalDatabase, package, -1 );
+    else if (package[0] == '#')
+        r = msi_set_property( db, szOriginalDatabase, db->path, -1 );
+    else
+    {
+        DWORD len;
+        WCHAR *path;
+
+        if (!(len = GetFullPathNameW( package, 0, NULL, NULL ))) return GetLastError();
+        if (!(path = msi_alloc( len * sizeof(WCHAR) ))) return ERROR_OUTOFMEMORY;
+        len = GetFullPathNameW( package, len, path, NULL );
+        r = msi_set_property( db, szOriginalDatabase, path, len );
+        msi_free( path );
+    }
+    return r;
+}
+
 UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
 {
     static const WCHAR dotmsi[] = {'.','m','s','i',0};
@@ -1619,17 +1641,6 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
         return r;
     }
     msi_set_property( package->db, szDatabase, db->path, -1 );
-
-    if( UrlIsW( szPackage, URLIS_URL ) )
-        msi_set_property( package->db, szOriginalDatabase, szPackage, -1 );
-    else if( szPackage[0] == '#' )
-        msi_set_property( package->db, szOriginalDatabase, db->path, -1 );
-    else
-    {
-        WCHAR fullpath[MAX_PATH];
-        DWORD len = GetFullPathNameW( szPackage, MAX_PATH, fullpath, NULL );
-        msi_set_property( package->db, szOriginalDatabase, fullpath, len );
-    }
     msi_set_context( package );
 
     while (1)
@@ -1656,6 +1667,12 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
         msi_clone_properties( package );
         msi_adjust_privilege_properties( package );
     }
+    r = msi_set_original_database_property( package->db, szPackage );
+    if (r != ERROR_SUCCESS)
+    {
+        msiobj_release( &package->hdr );
+        return r;
+    }
     if (gszLogFile)
         package->log_file = CreateFileW( gszLogFile, GENERIC_WRITE, FILE_SHARE_WRITE, NULL,
                                          OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL );
diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c
index 4bac512..13a07e6 100644
--- a/dlls/msi/tests/package.c
+++ b/dlls/msi/tests/package.c
@@ -2250,7 +2250,7 @@ static void test_property_table(void)
 
     sprintf(package, "#%i", hdb);
     r = MsiOpenPackage(package, &hpkg);
-    todo_wine ok(r != ERROR_SUCCESS, "MsiOpenPackage succeeded\n");
+    ok(r != ERROR_SUCCESS, "MsiOpenPackage succeeded\n");
     if (r == ERROR_SUCCESS)
         MsiCloseHandle(hpkg);
 
-- 
1.7.10.4







More information about the wine-patches mailing list