From: "Bernhard Übelacker" Subject: [PATCH 1/1] Fix regression in if condition parsing. Message-Id: <20200317165800.13544-1-bernhardu@mailbox.org> Date: Tue, 17 Mar 2020 17:58:00 +0100 Regression introduced in f238e846e701d2039eceb51f2f6e9d936f8c791c. Therefore if conditions got influenced by values of the previous line. Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=47770 Wine-Bug: https://bugs.winehq.org/show_bug.cgi?id=48738 Signed-off-by: Bernhard Übelacker --- programs/cmd/builtins.c | 6 ++++++ programs/cmd/wcmdmain.c | 15 +++++++-------- 2 files changed, 13 insertions(+), 8 deletions(-) diff --git a/programs/cmd/builtins.c b/programs/cmd/builtins.c index 43c4d9efef..8911a597eb 100644 --- a/programs/cmd/builtins.c +++ b/programs/cmd/builtins.c @@ -2938,9 +2938,15 @@ void WCMD_if (WCHAR *p, CMD_LIST **cmdList) int test; /* Condition evaluation result */ WCHAR *command; + /* Function evaluate_if_condition relies on the global variables quals, param1 and param2 + set in a call to WCMD_parse before */ if (evaluate_if_condition(p, &command, &test, &negate) == -1) goto syntax_err; + WINE_TRACE("p: %s, quals: %s, param1: %s, param2: %s, command: %s\n", + wine_dbgstr_w(p), wine_dbgstr_w(quals), wine_dbgstr_w(param1), + wine_dbgstr_w(param2), wine_dbgstr_w(command)); + /* Process rest of IF statement which is on the same line Note: This may process all or some of the cmdList (eg a GOTO) */ WCMD_part_execute(cmdList, command, TRUE, (test != negate)); diff --git a/programs/cmd/wcmdmain.c b/programs/cmd/wcmdmain.c index 5cad22b7ee..f6c770c9b8 100644 --- a/programs/cmd/wcmdmain.c +++ b/programs/cmd/wcmdmain.c @@ -1947,8 +1947,6 @@ WCHAR *WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_LIST **output, HANDLE To be able to handle ('s in the condition part take as much as evaluate_if_condition would take and skip parsing it here. */ } else if (WCMD_keyword_ws_found(ifCmd, ARRAY_SIZE(ifCmd), curPos)) { - static const WCHAR parmI[] = {'/','I','\0'}; - static const WCHAR notW[] = {'n','o','t','\0'}; int negate; /* Negate condition */ int test; /* Condition evaluation result */ WCHAR *p, *command; @@ -1956,17 +1954,18 @@ WCHAR *WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_LIST **output, HANDLE inIf = TRUE; p = curPos+(ARRAY_SIZE(ifCmd)); - while (*p == ' ' || *p == '\t') { + while (*p == ' ' || *p == '\t') p++; - if (lstrcmpiW(WCMD_parameter(p, 0, NULL, TRUE, FALSE), notW) == 0) - p += lstrlenW(notW); - if (lstrcmpiW(WCMD_parameter(p, 0, NULL, TRUE, FALSE), parmI) == 0) - p += lstrlenW(parmI); - } + WCMD_parse (p, quals, param1, param2); + /* Function evaluate_if_condition relies on the global variables quals, param1 and param2 + set in a call to WCMD_parse before */ if (evaluate_if_condition(p, &command, &test, &negate) != -1) { int if_condition_len = command - curPos; + WINE_TRACE("p: %s, quals: %s, param1: %s, param2: %s, command: %s, if_condition_len: %d\n", + wine_dbgstr_w(p), wine_dbgstr_w(quals), wine_dbgstr_w(param1), + wine_dbgstr_w(param2), wine_dbgstr_w(command), if_condition_len); memcpy(&curCopyTo[*curLen], curPos, if_condition_len*sizeof(WCHAR)); (*curLen)+=if_condition_len; curPos+=if_condition_len; -- 2.20.1