[CMD] Don't pass CTRL-C to child processes.
authorJames Woodcock <james_woodcock@yahoo.co.uk>
Fri, 27 Apr 2018 15:12:23 +0000 (16:12 +0100)
committerHermès Bélusca-Maïto <hermes.belusca-maito@reactos.org>
Sat, 28 Apr 2018 20:16:50 +0000 (22:16 +0200)
CORE-11677

The standard Win32 Console Control Handler will give CTRL-C events to
processes spawned from cmd.exe. If cmd.exe calls GenerateConsolCtrlEvent()
then the child process will receive two CTRL-C events.

base/shell/cmd/cmd.c

index d9a03a2..89a2b1b 100644 (file)
@@ -429,7 +429,7 @@ Execute(LPTSTR Full, LPTSTR First, LPTSTR Rest, PARSED_COMMAND *Cmd)
                           NULL,
                           NULL,
                           TRUE,
-                          0,   /* CREATE_NEW_PROCESS_GROUP */
+                          0,
                           NULL,
                           NULL,
                           &stui,
@@ -1459,26 +1459,16 @@ BOOL WINAPI BreakHandler(DWORD dwCtrlType)
 {
     DWORD           dwWritten;
     INPUT_RECORD    rec;
-    static BOOL SelfGenerated = FALSE;
 
     if ((dwCtrlType != CTRL_C_EVENT) &&
         (dwCtrlType != CTRL_BREAK_EVENT))
     {
         return FALSE;
     }
-    else
-    {
-        if (SelfGenerated)
-        {
-            SelfGenerated = FALSE;
-            return TRUE;
-        }
-    }
 
     if (!TryEnterCriticalSection(&ChildProcessRunningLock))
     {
-        SelfGenerated = TRUE;
-        GenerateConsoleCtrlEvent (dwCtrlType, 0);
+        /* Child process is running and will have received the control event */
         return TRUE;
     }
     else