From 9ce8592b0680e31c2bb4bd723421ff20c4f3719c Mon Sep 17 00:00:00 2001 From: Piotr Caban Date: Tue, 24 Oct 2017 15:03:00 +0200 Subject: [PATCH] msi: Add error handling when retriving component/feature state/action in condition. Signed-off-by: Piotr Caban Signed-off-by: Hans Leidekker Signed-off-by: Alexandre Julliard --- dlls/msi/cond.y | 46 ++++++++++++++++++++++++++++------------ dlls/msi/tests/package.c | 8 ++++++- 2 files changed, 39 insertions(+), 15 deletions(-) diff --git a/dlls/msi/cond.y b/dlls/msi/cond.y index 712050c9ece..6ee6ab979cc 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 3120252488e..002e6920cfc 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");