Commit b1e91a36 authored by Bernhard Übelacker's avatar Bernhard Übelacker Committed by Alexandre Julliard

cmd: Fix crash in if condition parsing.

parent ab5e48f4
...@@ -2938,9 +2938,15 @@ void WCMD_if (WCHAR *p, CMD_LIST **cmdList) ...@@ -2938,9 +2938,15 @@ void WCMD_if (WCHAR *p, CMD_LIST **cmdList)
int test; /* Condition evaluation result */ int test; /* Condition evaluation result */
WCHAR *command; 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) if (evaluate_if_condition(p, &command, &test, &negate) == -1)
goto syntax_err; 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 /* Process rest of IF statement which is on the same line
Note: This may process all or some of the cmdList (eg a GOTO) */ Note: This may process all or some of the cmdList (eg a GOTO) */
WCMD_part_execute(cmdList, command, TRUE, (test != negate)); WCMD_part_execute(cmdList, command, TRUE, (test != negate));
......
...@@ -1947,8 +1947,6 @@ WCHAR *WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_LIST **output, HANDLE ...@@ -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 To be able to handle ('s in the condition part take as much as evaluate_if_condition
would take and skip parsing it here. */ would take and skip parsing it here. */
} else if (WCMD_keyword_ws_found(ifCmd, ARRAY_SIZE(ifCmd), curPos)) { } 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 negate; /* Negate condition */
int test; /* Condition evaluation result */ int test; /* Condition evaluation result */
WCHAR *p, *command; WCHAR *p, *command;
...@@ -1956,17 +1954,18 @@ WCHAR *WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_LIST **output, HANDLE ...@@ -1956,17 +1954,18 @@ WCHAR *WCMD_ReadAndParseLine(const WCHAR *optionalcmd, CMD_LIST **output, HANDLE
inIf = TRUE; inIf = TRUE;
p = curPos+(ARRAY_SIZE(ifCmd)); p = curPos+(ARRAY_SIZE(ifCmd));
while (*p == ' ' || *p == '\t') { while (*p == ' ' || *p == '\t')
p++; p++;
if (lstrcmpiW(WCMD_parameter(p, 0, NULL, TRUE, FALSE), notW) == 0) WCMD_parse (p, quals, param1, param2);
p += lstrlenW(notW);
if (lstrcmpiW(WCMD_parameter(p, 0, NULL, TRUE, FALSE), parmI) == 0)
p += lstrlenW(parmI);
}
/* 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) if (evaluate_if_condition(p, &command, &test, &negate) != -1)
{ {
int if_condition_len = command - curPos; 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)); memcpy(&curCopyTo[*curLen], curPos, if_condition_len*sizeof(WCHAR));
(*curLen)+=if_condition_len; (*curLen)+=if_condition_len;
curPos+=if_condition_len; curPos+=if_condition_len;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment