[PATCH 1/1] Fix regression in if condition parsing.

Bernhard Übelacker bernhardu at mailbox.org
Tue Mar 17 11:58:00 CDT 2020


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 <bernhardu at mailbox.org>
---
 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




More information about the wine-devel mailing list