msi [2/2]: Ignore invalid conditional expressions when checking the launch conditions

James Hawkins truiken at gmail.com
Thu Jun 28 17:12:39 CDT 2007


Hi,

Fixes bug 8751.  http://bugs.winehq.org/show_bug.cgi?id=8751

Changelog:
* Ignore invalid conditional expressions when checking the launch conditions.

 dlls/msi/action.c        |   21 +++++++++-----
 dlls/msi/tests/package.c |   71 ++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 85 insertions(+), 7 deletions(-)

-- 
James Hawkins
-------------- next part --------------
diff --git a/dlls/msi/action.c b/dlls/msi/action.c
index b550e54..9c95779 100644
--- a/dlls/msi/action.c
+++ b/dlls/msi/action.c
@@ -2512,19 +2512,26 @@ static UINT ITERATE_LaunchConditions(MSI
     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..5716537 100644
--- a/dlls/msi/tests/package.c
+++ b/dlls/msi/tests/package.c
@@ -147,6 +147,15 @@ static UINT create_signature_table( MSIH
             "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,23 @@ static UINT add_signature_entry( MSIHAND
     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);
+    printf("query: %s\n", query);
+    r = run_query( hdb, query );
+    HeapFree(GetProcessHeap(), 0, query);
+    return r;
+}
+
 static UINT set_summary_info(MSIHANDLE hdb)
 {
     UINT res;
@@ -3229,6 +3255,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 +3320,5 @@ START_TEST(package)
     test_installprops();
     test_sourcedirprop();
     test_prop_path();
+    test_launchconditions();
 }
-- 
1.4.1


More information about the wine-patches mailing list