https://git.reactos.org/?p=reactos.git;a=commitdiff;h=34c2011c9f00f3c3e7879…
commit 34c2011c9f00f3c3e7879ccb23bbca23bf7fdb58
Author: winesync <ros-dev(a)reactos.org>
AuthorDate: Sat Mar 12 15:11:49 2022 +0100
Commit: Mark Jansen <mark.jansen(a)reactos.org>
CommitDate: Sun Mar 20 19:27:35 2022 +0100
[WINESYNC] msi: Don't cache the base URL.
Signed-off-by: Hans Leidekker <hans(a)codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard(a)winehq.org>
wine commit id 99aa0eb5d8777b790f1aa3c643217571274b744f by Hans Leidekker
<hans(a)codeweavers.com>
---
dll/win32/msi/dialog.c | 2 +-
dll/win32/msi/media.c | 40 ++++++++++++++++++++++++++++++----------
dll/win32/msi/msipriv.h | 3 +--
dll/win32/msi/package.c | 25 +++----------------------
4 files changed, 35 insertions(+), 35 deletions(-)
diff --git a/dll/win32/msi/dialog.c b/dll/win32/msi/dialog.c
index 8cec1954ecb..32414f1c65b 100644
--- a/dll/win32/msi/dialog.c
+++ b/dll/win32/msi/dialog.c
@@ -4130,7 +4130,7 @@ static MSIPREVIEW *MSI_EnableUIPreview( MSIDATABASE *db )
MSIPREVIEW *preview = NULL;
MSIPACKAGE *package;
- package = MSI_CreatePackage( db, NULL );
+ package = MSI_CreatePackage( db );
if (package)
{
preview = alloc_msiobject( MSIHANDLETYPE_PREVIEW, sizeof(MSIPREVIEW),
MSI_ClosePreview );
diff --git a/dll/win32/msi/media.c b/dll/win32/msi/media.c
index 0bb883b34a6..3d4a8c09eb6 100644
--- a/dll/win32/msi/media.c
+++ b/dll/win32/msi/media.c
@@ -678,6 +678,14 @@ static UINT get_drive_type(const WCHAR *path)
return GetDriveTypeW(root);
}
+static WCHAR *get_base_url( MSIDATABASE *db )
+{
+ WCHAR *p, *ret = NULL, *orig_db = msi_dup_property( db, szOriginalDatabase );
+ if (UrlIsW( orig_db, URLIS_URL ) && (ret = strdupW( orig_db )) && (p
= strrchrW( ret, '/'))) p[1] = 0;
+ msi_free( orig_db );
+ return ret;
+}
+
UINT msi_load_media_info(MSIPACKAGE *package, UINT Sequence, MSIMEDIAINFO *mi)
{
static const WCHAR query[] = {
@@ -685,7 +693,7 @@ UINT msi_load_media_info(MSIPACKAGE *package, UINT Sequence,
MSIMEDIAINFO *mi)
'W','H','E','R','E','
','`','L','a','s','t','S','e','q','u','e','n','c','e','`','
',
'>','=',' ','%','i','
','O','R','D','E','R','
','B','Y','
','`','D','i','s','k','I','d','`',0};
MSIRECORD *row;
- LPWSTR source_dir, source;
+ WCHAR *source_dir, *source, *base_url = NULL;
DWORD options;
if (Sequence <= mi->last_sequence) /* already loaded */
@@ -721,9 +729,9 @@ UINT msi_load_media_info(MSIPACKAGE *package, UINT Sequence,
MSIMEDIAINFO *mi)
source = source_dir;
options |= MSISOURCETYPE_MEDIA;
}
- else if (package->BaseURL && UrlIsW(package->BaseURL, URLIS_URL))
+ else if ((base_url = get_base_url(package->db)))
{
- source = package->BaseURL;
+ source = base_url;
options |= MSISOURCETYPE_URL;
}
else
@@ -739,8 +747,10 @@ UINT msi_load_media_info(MSIPACKAGE *package, UINT Sequence,
MSIMEDIAINFO *mi)
msi_package_add_info(package, package->Context,
options, INSTALLPROPERTY_LASTUSEDSOURCEW, source);
- msi_free(source_dir);
TRACE("sequence %u -> cabinet %s disk id %u\n", Sequence,
debugstr_w(mi->cabinet), mi->disk_id);
+
+ msi_free(base_url);
+ msi_free(source_dir);
return ERROR_SUCCESS;
}
@@ -851,6 +861,8 @@ UINT ready_media( MSIPACKAGE *package, BOOL compressed, MSIMEDIAINFO
*mi )
if (mi->cabinet)
{
+ WCHAR *base_url;
+
/* cabinet is internal, no checks needed */
if (mi->cabinet[0] == '#') return ERROR_SUCCESS;
@@ -858,14 +870,21 @@ UINT ready_media( MSIPACKAGE *package, BOOL compressed, MSIMEDIAINFO
*mi )
/* package should be downloaded */
if (compressed && GetFileAttributesW( cabinet_file ) ==
INVALID_FILE_ATTRIBUTES &&
- package->BaseURL && UrlIsW( package->BaseURL, URLIS_URL ))
+ (base_url = get_base_url( package->db )))
{
- WCHAR temppath[MAX_PATH], *p;
+ WCHAR temppath[MAX_PATH], *p, *url;
- if ((rc = msi_download_file( cabinet_file, temppath )) != ERROR_SUCCESS)
+ msi_free( cabinet_file );
+ if (!(url = msi_alloc( (strlenW( base_url ) + strlenW( mi->cabinet ) + 1)
* sizeof(WCHAR) )))
{
- ERR("failed to download %s (%u)\n", debugstr_w(cabinet_file),
rc);
- msi_free( cabinet_file );
+ return ERROR_OUTOFMEMORY;
+ }
+ strcpyW( url, base_url );
+ strcatW( url, mi->cabinet );
+ if ((rc = msi_download_file( url, temppath )) != ERROR_SUCCESS)
+ {
+ ERR("failed to download %s (%u)\n", debugstr_w(url), rc);
+ msi_free( url );
return rc;
}
if ((p = strrchrW( temppath, '\\' ))) *p = 0;
@@ -873,7 +892,8 @@ UINT ready_media( MSIPACKAGE *package, BOOL compressed, MSIMEDIAINFO
*mi )
PathAddBackslashW( mi->sourcedir );
msi_free( mi->cabinet );
mi->cabinet = strdupW( p + 1 );
- msi_free( cabinet_file );
+
+ msi_free( url );
return ERROR_SUCCESS;
}
}
diff --git a/dll/win32/msi/msipriv.h b/dll/win32/msi/msipriv.h
index a0423a60061..cc2b8bec790 100644
--- a/dll/win32/msi/msipriv.h
+++ b/dll/win32/msi/msipriv.h
@@ -424,7 +424,6 @@ typedef struct tagMSIPACKAGE
struct list RunningActions;
- LPWSTR BaseURL;
LPWSTR PackagePath;
LPWSTR ProductCode;
LPWSTR localfile;
@@ -861,7 +860,7 @@ extern UINT msi_view_get_row(MSIDATABASE *, MSIVIEW *, UINT, MSIRECORD
**) DECLS
extern UINT MSI_SetInstallLevel( MSIPACKAGE *package, int iInstallLevel )
DECLSPEC_HIDDEN;
/* package internals */
-extern MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *, LPCWSTR ) DECLSPEC_HIDDEN;
+extern MSIPACKAGE *MSI_CreatePackage( MSIDATABASE * ) DECLSPEC_HIDDEN;
extern UINT MSI_OpenPackageW( LPCWSTR szPackage, MSIPACKAGE **pPackage )
DECLSPEC_HIDDEN;
extern UINT MSI_SetTargetPathW( MSIPACKAGE *, LPCWSTR, LPCWSTR ) DECLSPEC_HIDDEN;
extern INT MSI_ProcessMessageVerbatim( MSIPACKAGE *, INSTALLMESSAGE, MSIRECORD * )
DECLSPEC_HIDDEN;
diff --git a/dll/win32/msi/package.c b/dll/win32/msi/package.c
index 87bd9f99861..49fe7900412 100644
--- a/dll/win32/msi/package.c
+++ b/dll/win32/msi/package.c
@@ -321,7 +321,6 @@ static void free_package_structures( MSIPACKAGE *package )
msi_free_patchinfo( patch );
}
- msi_free( package->BaseURL );
msi_free( package->PackagePath );
msi_free( package->ProductCode );
msi_free( package->ActionFormat );
@@ -1056,7 +1055,7 @@ void msi_adjust_privilege_properties( MSIPACKAGE *package )
msi_set_property( package->db, szAdminUser, szOne, -1 );
}
-MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url )
+MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db )
{
static const WCHAR fmtW[] = {'%','u',0};
MSIPACKAGE *package;
@@ -1077,7 +1076,6 @@ MSIPACKAGE *MSI_CreatePackage( MSIDATABASE *db, LPCWSTR base_url )
package->LastActionResult = MSI_NULL_INTEGER;
package->WordCount = 0;
package->PackagePath = strdupW( db->path );
- package->BaseURL = strdupW( base_url );
create_temp_property_table( package );
msi_clone_properties( package->db );
@@ -1447,15 +1445,13 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
MSIPACKAGE *package;
MSIHANDLE handle;
MSIRECORD *data_row, *info_row;
- LPWSTR ptr, base_url = NULL;
UINT r;
WCHAR localfile[MAX_PATH], cachefile[MAX_PATH];
LPCWSTR file = szPackage;
DWORD index = 0;
MSISUMMARYINFO *si;
BOOL delete_on_close = FALSE;
- LPWSTR productname;
- WCHAR *info_template;
+ WCHAR *info_template, *productname;
TRACE("%s %p\n", debugstr_w(szPackage), pPackage);
@@ -1487,13 +1483,6 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
return r;
file = cachefile;
-
- base_url = strdupW( szPackage );
- if (!base_url)
- return ERROR_OUTOFMEMORY;
-
- ptr = strrchrW( base_url, '/' );
- if (ptr) *(ptr + 1) = '\0';
}
r = get_local_package( file, localfile );
if (r != ERROR_SUCCESS || GetFileAttributesW( localfile ) ==
INVALID_FILE_ATTRIBUTES)
@@ -1502,17 +1491,13 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
r = msi_create_empty_local_file( localfile, dotmsi );
if (r != ERROR_SUCCESS)
- {
- msi_free ( base_url );
return r;
- }
if (!CopyFileW( file, localfile, FALSE ))
{
r = GetLastError();
WARN("unable to copy package %s to %s (%u)\n",
debugstr_w(file), debugstr_w(localfile), r);
DeleteFileW( localfile );
- msi_free ( base_url );
return r;
}
delete_on_close = TRUE;
@@ -1525,13 +1510,9 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
TRACE("opening package %s\n", debugstr_w( localfile ));
r = MSI_OpenDatabaseW( localfile, MSIDBOPEN_TRANSACT, &db );
if (r != ERROR_SUCCESS)
- {
- msi_free ( base_url );
return r;
- }
}
- package = MSI_CreatePackage( db, base_url );
- msi_free( base_url );
+ package = MSI_CreatePackage( db );
msiobj_release( &db->hdr );
if (!package) return ERROR_INSTALL_PACKAGE_INVALID;
package->localfile = strdupW( localfile );