msi: Ignore invalid conditional expressions when checking the launch conditions.
diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index b550e54..cc2583d 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -2512,19 +2512,26 @@
MSIPACKAGE* package = (MSIPACKAGE*)param;
LPCWSTR cond = NULL;
LPCWSTR message = NULL;
+ UINT r;
+
static const WCHAR title[]=
{'I','n','s','t','a','l','l',' ','F','a', 'i','l','e','d',0};
cond = MSI_RecordGetString(row,1);
- if (MSI_EvaluateConditionW(package,cond) != MSICONDITION_TRUE)
+ r = MSI_EvaluateConditionW(package,cond);
+ if (r == MSICONDITION_FALSE)
{
- LPWSTR deformated;
- message = MSI_RecordGetString(row,2);
- deformat_string(package,message,&deformated);
- MessageBoxW(NULL,deformated,title,MB_OK);
- msi_free(deformated);
- return ERROR_FUNCTION_FAILED;
+ if ((gUILevel & INSTALLUILEVEL_MASK) != INSTALLUILEVEL_NONE)
+ {
+ LPWSTR deformated;
+ message = MSI_RecordGetString(row,2);
+ deformat_string(package,message,&deformated);
+ MessageBoxW(NULL,deformated,title,MB_OK);
+ msi_free(deformated);
+ }
+
+ return ERROR_INSTALL_FAILURE;
}
return ERROR_SUCCESS;
diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c
index 1a83724..2844a26 100644
--- a/dlls/msi/tests/package.c
+++ b/dlls/msi/tests/package.c
@@ -147,6 +147,15 @@
"PRIMARY KEY `Signature`)" );
}
+static UINT create_launchcondition_table( MSIHANDLE hdb )
+{
+ return run_query( hdb,
+ "CREATE TABLE `LaunchCondition` ("
+ "`Condition` CHAR(255) NOT NULL, "
+ "`Description` CHAR(255) NOT NULL "
+ "PRIMARY KEY `Condition`)" );
+}
+
static UINT add_component_entry( MSIHANDLE hdb, const char *values )
{
char insert[] = "INSERT INTO `Component` "
@@ -259,6 +268,22 @@
return r;
}
+static UINT add_launchcondition_entry( MSIHANDLE hdb, const char *values )
+{
+ char insert[] = "INSERT INTO `LaunchCondition` "
+ "(`Condition`, `Description`) "
+ "VALUES( %s )";
+ char *query;
+ UINT sz, r;
+
+ sz = strlen(values) + sizeof insert;
+ query = HeapAlloc(GetProcessHeap(),0,sz);
+ sprintf(query,insert,values);
+ r = run_query( hdb, query );
+ HeapFree(GetProcessHeap(), 0, query);
+ return r;
+}
+
static UINT set_summary_info(MSIHANDLE hdb)
{
UINT res;
@@ -3229,6 +3254,50 @@
DeleteFile(msifile);
}
+static void test_launchconditions(void)
+{
+ MSIHANDLE hpkg;
+ MSIHANDLE hdb;
+ UINT r;
+
+ MsiSetInternalUI(INSTALLUILEVEL_NONE, NULL);
+
+ hdb = create_package_db();
+ ok( hdb, "failed to create package database\n" );
+
+ r = create_launchcondition_table( hdb );
+ ok( r == ERROR_SUCCESS, "cannot create LaunchCondition table: %d\n", r );
+
+ r = add_launchcondition_entry( hdb, "'X = \"1\"', 'one'" );
+ ok( r == ERROR_SUCCESS, "cannot add launch condition: %d\n", r );
+
+ /* invalid condition */
+ r = add_launchcondition_entry( hdb, "'X != \"1\"', 'one'" );
+ ok( r == ERROR_SUCCESS, "cannot add launch condition: %d\n", r );
+
+ hpkg = package_from_db( hdb );
+ ok( hpkg, "failed to create package\n");
+
+ MsiCloseHandle( hdb );
+
+ r = MsiSetProperty( hpkg, "X", "1" );
+ ok( r == ERROR_SUCCESS, "failed to set property\n" );
+
+ /* invalid conditions are ignored */
+ r = MsiDoAction( hpkg, "LaunchConditions" );
+ ok( r == ERROR_SUCCESS, "cost init failed\n" );
+
+ /* verify LaunchConditions still does some verification */
+ r = MsiSetProperty( hpkg, "X", "2" );
+ ok( r == ERROR_SUCCESS, "failed to set property\n" );
+
+ r = MsiDoAction( hpkg, "LaunchConditions" );
+ ok( r == ERROR_INSTALL_FAILURE, "Expected ERROR_INSTALL_FAILURE, got %d\n", r );
+
+ MsiCloseHandle( hpkg );
+ DeleteFile( msifile );
+}
+
START_TEST(package)
{
test_createpackage();
@@ -3250,4 +3319,5 @@
test_installprops();
test_sourcedirprop();
test_prop_path();
+ test_launchconditions();
}