Commit ca7cd1bf authored by Hans Leidekker's avatar Hans Leidekker Committed by Alexandre Julliard

msi: Validate packages based on supported version, platform and languages.

parent 8bc9a499
......@@ -315,6 +315,7 @@ typedef struct tagMSIPACKAGE
{
MSIOBJECTHDR hdr;
MSIDATABASE *db;
INT version;
enum platform platform;
UINT num_langids;
LANGID *langids;
......@@ -855,6 +856,7 @@ extern UINT msi_spawn_error_dialog( MSIPACKAGE*, LPWSTR, LPWSTR );
/* summary information */
extern MSISUMMARYINFO *MSI_GetSummaryInformationW( IStorage *stg, UINT uiUpdateCount );
extern LPWSTR msi_suminfo_dup_string( MSISUMMARYINFO *si, UINT uiProperty );
extern INT msi_suminfo_get_int32( MSISUMMARYINFO *si, UINT uiProperty );
extern LPWSTR msi_get_suminfo_product( IStorage *stg );
extern UINT msi_add_suminfo( MSIDATABASE *db, LPWSTR **records, int num_records, int num_columns );
......
......@@ -1292,6 +1292,9 @@ static UINT msi_parse_summary( MSISUMMARYINFO *si, MSIPACKAGE *package )
WCHAR *template, *p, *q;
DWORD i, count;
package->version = msi_suminfo_get_int32( si, PID_PAGECOUNT );
TRACE("version: %d\n", package->version);
template = msi_suminfo_dup_string( si, PID_TEMPLATE );
if (!template)
return ERROR_SUCCESS; /* native accepts missing template property */
......@@ -1316,7 +1319,7 @@ static UINT msi_parse_summary( MSISUMMARYINFO *si, MSIPACKAGE *package )
{
WARN("unknown platform %s\n", debugstr_w(template));
msi_free( template );
return ERROR_PATCH_PACKAGE_INVALID;
return ERROR_INSTALL_PLATFORM_UNSUPPORTED;
}
count = 1;
......@@ -1345,6 +1348,32 @@ static UINT msi_parse_summary( MSISUMMARYINFO *si, MSIPACKAGE *package )
return ERROR_SUCCESS;
}
static UINT validate_package( MSIPACKAGE *package )
{
static const BOOL is_64bit = sizeof(void *) > sizeof(int);
BOOL is_wow64;
UINT i;
IsWow64Process( GetCurrentProcess(), &is_wow64 );
if (package->platform == PLATFORM_X64)
{
if (!is_64bit && !is_wow64)
return ERROR_INSTALL_PLATFORM_UNSUPPORTED;
if (package->version < 200)
return ERROR_INSTALL_PACKAGE_INVALID;
}
if (!package->num_langids)
{
return ERROR_SUCCESS;
}
for (i = 0; i < package->num_langids; i++)
{
if (!package->langids[i] || IsValidLocale( package->langids[i], LCID_INSTALLED ))
return ERROR_SUCCESS;
}
return ERROR_INSTALL_LANGUAGE_UNSUPPORTED;
}
UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
{
static const WCHAR Database[] = {'D','A','T','A','B','A','S','E',0};
......@@ -1474,6 +1503,12 @@ UINT MSI_OpenPackageW(LPCWSTR szPackage, MSIPACKAGE **pPackage)
return r;
}
r = validate_package( package );
if (r != ERROR_SUCCESS)
{
msiobj_release( &package->hdr );
return r;
}
msi_set_property( package->db, Database, db->path );
if( UrlIsW( szPackage, URLIS_URL ) )
......
......@@ -644,6 +644,18 @@ LPWSTR msi_suminfo_dup_string( MSISUMMARYINFO *si, UINT uiProperty )
return strdupAtoW( prop->u.pszVal );
}
INT msi_suminfo_get_int32( MSISUMMARYINFO *si, UINT uiProperty )
{
PROPVARIANT *prop;
if ( uiProperty >= MSI_MAX_PROPS )
return -1;
prop = &si->property[uiProperty];
if( prop->vt != VT_I4 )
return -1;
return prop->u.lVal;
}
LPWSTR msi_get_suminfo_product( IStorage *stg )
{
MSISUMMARYINFO *si;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment