James Hawkins : msi: Ignore invalid conditional expressions when checking the launch conditions .

Alexandre Julliard julliard at wine.codeweavers.com
Fri Jun 29 08:14:34 CDT 2007


Module: wine
Branch: master
Commit: bafc4dc3854f59ec0e07aaa202a260c3cf56c5eb
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=bafc4dc3854f59ec0e07aaa202a260c3cf56c5eb

Author: James Hawkins <truiken at 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();
 }




More information about the wine-cvs mailing list