[PATCH 4/4] msi: Add error handling when retriving component/feature state/action in condition

Piotr Caban <[email protected]>
Newsgroups gmane.comp.emulators.wine.patches
Message-ID <[email protected]>
Signed-off-by: Piotr Caban <[email protected]>
---
  dlls/msi/cond.y          | 46 
++++++++++++++++++++++++++++++++--------------
  dlls/msi/tests/package.c |  8 +++++++-
  2 files changed, 39 insertions(+), 15 deletions(-)
0004-msi-Add-error-handling-when-retriving-component-featur.txt (text/x-patch, 3.8 KB)
diff --git a/dlls/msi/cond.y b/dlls/msi/cond.y
index 712050c9ec..6ee6ab979c 100644
--- a/dlls/msi/cond.y
+++ b/dlls/msi/cond.y
@@ -321,9 +321,16 @@ value:
             COND_input* cond = (COND_input*) info;
             INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
       
-            MSI_GetComponentStateW(cond->package, $2, &install, &action );
-            $$.type = VALUE_INTEGER;
-            $$.u.integer = action;
+            if(MSI_GetComponentStateW(cond->package, $2, &install, &action ) != ERROR_SUCCESS)
+            {
+                $$.type = VALUE_LITERAL;
+                $$.u.string = NULL;
+            }
+            else
+            {
+                $$.type = VALUE_INTEGER;
+                $$.u.integer = action;
+            }
             cond_free( $2 );
         }
   | COND_QUESTION identifier
@@ -331,9 +338,16 @@ value:
             COND_input* cond = (COND_input*) info;
             INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
       
-            MSI_GetComponentStateW(cond->package, $2, &install, &action );\
-            $$.type = VALUE_INTEGER;
-            $$.u.integer = install;
+            if(MSI_GetComponentStateW(cond->package, $2, &install, &action ) != ERROR_SUCCESS)
+            {
+                $$.type = VALUE_LITERAL;
+                $$.u.string = NULL;
+            }
+            else
+            {
+                $$.type = VALUE_INTEGER;
+                $$.u.integer = install;
+            }
             cond_free( $2 );
         }
   | COND_AMPER identifier
@@ -343,17 +357,14 @@ value:
       
             if (MSI_GetFeatureStateW(cond->package, $2, &install, &action ) != ERROR_SUCCESS)
             {
-                FIXME("condition may be evaluated incorrectly\n");
-                /* we should return empty string in this case */
-                $$.type = VALUE_INTEGER;
-                $$.u.integer = MSICONDITION_FALSE;
+                $$.type = VALUE_LITERAL;
+                $$.u.string = NULL;
             }
             else
             {
                 $$.type = VALUE_INTEGER;
                 $$.u.integer = action;
             }
-
             cond_free( $2 );
         }
   | COND_EXCLAM identifier
@@ -361,9 +372,16 @@ value:
             COND_input* cond = (COND_input*) info;
             INSTALLSTATE install = INSTALLSTATE_UNKNOWN, action = INSTALLSTATE_UNKNOWN;
       
-            MSI_GetFeatureStateW(cond->package, $2, &install, &action );
-            $$.type = VALUE_INTEGER;
-            $$.u.integer = install;
+            if(MSI_GetFeatureStateW(cond->package, $2, &install, &action ) != ERROR_SUCCESS)
+            {
+                $$.type = VALUE_LITERAL;
+                $$.u.string = NULL;
+            }
+            else
+            {
+                $$.type = VALUE_INTEGER;
+                $$.u.integer = install;
+            }
             cond_free( $2 );
         }
     ;
diff --git a/dlls/msi/tests/package.c b/dlls/msi/tests/package.c
index 3120252488..002e6920cf 100644
--- a/dlls/msi/tests/package.c
+++ b/dlls/msi/tests/package.c
@@ -2070,7 +2070,13 @@ static void test_condition(void)
     r = MsiEvaluateConditionA(hpkg, "&nofeature");
     ok( r == MSICONDITION_FALSE, "wrong return val (%d)\n", r);
     r = MsiEvaluateConditionA(hpkg, "&nofeature=\"\"");
-    todo_wine ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
+    ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
+    r = MsiEvaluateConditionA(hpkg, "!nofeature=\"\"");
+    ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
+    MsiEvaluateConditionA(hpkg, "$nocomponent=\"\"");
+    ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
+    MsiEvaluateConditionA(hpkg, "?nocomponent=\"\"");
+    ok( r == MSICONDITION_TRUE, "wrong return val (%d)\n", r);
 
     MsiSetPropertyA(hpkg, "A", "2");
     MsiSetPropertyA(hpkg, "X", "50");
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.