Module: wine Branch: master Commit: bafc4dc3854f59ec0e07aaa202a260c3cf56c5eb URL: http://source.winehq.org/git/wine.git/?a=commit;h=bafc4dc3854f59ec0e07aaa202...
Author: James Hawkins truiken@gmail.com Date: Thu Jun 28 15:38:58 2007 -0700
msi: Ignore invalid conditional expressions when checking the launch conditions.
---
dlls/msi/action.c | 21 +++++++++---- dlls/msi/tests/package.c | 70 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 7 deletions(-)
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 @@ static UINT ITERATE_LaunchConditions(MSIRECORD *row, LPVOID param) 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 @@ static UINT create_signature_table( MSIHANDLE hdb ) "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 @@ static UINT add_signature_entry( MSIHANDLE hdb, const char *values ) 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 @@ static void test_prop_path(void) 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 @@ START_TEST(package) test_installprops(); test_sourcedirprop(); test_prop_path(); + test_launchconditions(); }