[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