Index: cmd/cmd.c =================================================================== --- cmd/cmd.c (revision 47213) +++ cmd/cmd.c (working copy) @@ -156,7 +156,7 @@ BOOL bCtrlBreak = FALSE; /* Ctrl-Break or Ctrl-C hit */ BOOL bIgnoreEcho = FALSE; /* Set this to TRUE to prevent a newline, when executing a command */ INT nErrorLevel = 0; /* Errorlevel of last launched external program */ -BOOL bChildProcessRunning = FALSE; +CRITICAL_SECTION ChildProcessRunningLock; BOOL bUnicodeOutput = FALSE; BOOL bDisableBatchEcho = FALSE; BOOL bDelayedExpansion = FALSE; @@ -436,14 +436,12 @@ { if (IsConsoleProcess(prci.hProcess)) { - /* FIXME: Protect this with critical section */ - bChildProcessRunning = TRUE; + EnterCriticalSection(&ChildProcessRunningLock); dwChildProcessId = prci.dwProcessId; WaitForSingleObject (prci.hProcess, INFINITE); - /* FIXME: Protect this with critical section */ - bChildProcessRunning = FALSE; + LeaveCriticalSection(&ChildProcessRunningLock); GetExitCodeProcess (prci.hProcess, &dwExitCode); nErrorLevel = (INT)dwExitCode; @@ -665,9 +663,9 @@ SetStdHandle(STD_INPUT_HANDLE, hOldConIn); /* Wait for all processes to complete */ - bChildProcessRunning = TRUE; + EnterCriticalSection(&ChildProcessRunningLock); WaitForMultipleObjects(nProcesses, hProcess, TRUE, INFINITE); - bChildProcessRunning = FALSE; + LeaveCriticalSection(&ChildProcessRunningLock); /* Use the exit code of the last process in the pipeline */ GetExitCodeProcess(hProcess[nProcesses - 1], &dwExitCode); @@ -1439,14 +1437,15 @@ } } - if (bChildProcessRunning == TRUE) + if (!TryEnterCriticalSection(&ChildProcessRunningLock)) { SelfGenerated = TRUE; GenerateConsoleCtrlEvent (dwCtrlType, 0); return TRUE; } + else + LeaveCriticalSection(&ChildProcessRunningLock); - rec.EventType = KEY_EVENT; rec.Event.KeyEvent.bKeyDown = TRUE; rec.Event.KeyEvent.wRepeatCount = 1; @@ -1797,6 +1796,7 @@ RemoveBreakHandler (); SetConsoleMode( GetStdHandle( STD_INPUT_HANDLE ), ENABLE_LINE_INPUT | ENABLE_PROCESSED_INPUT | ENABLE_ECHO_INPUT ); + DeleteCriticalSection(&ChildProcessRunningLock); } /* @@ -1808,7 +1808,8 @@ TCHAR startPath[MAX_PATH]; CONSOLE_SCREEN_BUFFER_INFO Info; - lpOriginalEnvironment = DuplicateEnvironment(); + InitializeCriticalSection(&ChildProcessRunningLock); + lpOriginalEnvironment = DuplicateEnvironment(); GetCurrentDirectory(MAX_PATH,startPath); _tchdir(startPath);