cmd: Fix crash in if condition parsing.
Regression introduced in f238e846e7
.
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@mailbox.org>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
parent
ab5e48f4fc
commit
b1e91a36a7
|
@ -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
|
||||||
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
|
||||||
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;
|
||||||
|
|
Loading…
Reference in New Issue