https://github.com/charles-zablit updated https://github.com/llvm/llvm-project/pull/175812
>From ca113a51b42d08382e0a9b6dd0636eba9f0d6ab4 Mon Sep 17 00:00:00 2001 From: Charles Zablit <[email protected]> Date: Tue, 13 Jan 2026 18:54:43 +0000 Subject: [PATCH 1/5] [lldb][windows] prevent IOHandlerProcessSTDIOWindows from consuming non text inputs --- .../Process/Windows/Common/ProcessWindows.cpp | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp index 127dd0f59e9ae..72043d16313cd 100644 --- a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp +++ b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp @@ -981,6 +981,9 @@ class IOHandlerProcessSTDIOWindows : public IOHandler { HANDLE hInterrupt = (HANDLE)_get_osfhandle(m_pipe.GetReadFileDescriptor()); HANDLE waitHandles[2] = {hStdin, hInterrupt}; + DWORD consoleMode; + bool isConsole = GetConsoleMode(hStdin, &consoleMode) != 0; + while (true) { { std::lock_guard<std::mutex> guard(m_mutex); @@ -993,6 +996,20 @@ class IOHandlerProcessSTDIOWindows : public IOHandler { case WAIT_FAILED: goto exit_loop; case WAIT_OBJECT_0: { + if (isConsole) { + INPUT_RECORD inputRecord; + DWORD numRead = 0; + if (!PeekConsoleInput(hStdin, &inputRecord, 1, &numRead) || + numRead == 0) + goto exit_loop; + // We only care about text input. Ignore all non text input events and + // let other IOHandlers handle them. + if (inputRecord.EventType != KEY_EVENT || + !inputRecord.Event.KeyEvent.bKeyDown || + inputRecord.Event.KeyEvent.uChar.AsciiChar == 0) + break; + } + char ch = 0; DWORD read = 0; if (!ReadFile(hStdin, &ch, 1, &read, nullptr) || read != 1) >From 0fa56fa8a08ea20f031baddce32d85f4bef20a41 Mon Sep 17 00:00:00 2001 From: Charles Zablit <[email protected]> Date: Mon, 19 Jan 2026 13:50:09 +0000 Subject: [PATCH 2/5] consume non text input --- .../Process/Windows/Common/ProcessWindows.cpp | 28 +++++++++++-------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp index 72043d16313cd..ed02f243a5445 100644 --- a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp +++ b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp @@ -997,17 +997,23 @@ class IOHandlerProcessSTDIOWindows : public IOHandler { goto exit_loop; case WAIT_OBJECT_0: { if (isConsole) { - INPUT_RECORD inputRecord; - DWORD numRead = 0; - if (!PeekConsoleInput(hStdin, &inputRecord, 1, &numRead) || - numRead == 0) - goto exit_loop; - // We only care about text input. Ignore all non text input events and - // let other IOHandlers handle them. - if (inputRecord.EventType != KEY_EVENT || - !inputRecord.Event.KeyEvent.bKeyDown || - inputRecord.Event.KeyEvent.uChar.AsciiChar == 0) - break; + while (true) { + INPUT_RECORD inputRecord; + DWORD numRead = 0; + if (!PeekConsoleInput(hStdin, &inputRecord, 1, &numRead) || + numRead == 0) + goto exit_loop; + + // We only care about text input. Consume all non text input events before letting ReadFile handle text input. + if (inputRecord.EventType == KEY_EVENT && + inputRecord.Event.KeyEvent.bKeyDown && + inputRecord.Event.KeyEvent.uChar.AsciiChar != 0) + break; + + if (!ReadConsoleInput(hStdin, &inputRecord, 1, &numRead) || + numRead == 0) + goto exit_loop; + } } char ch = 0; >From 275e21f2179b313337d56f0ada62f6fb70dd767d Mon Sep 17 00:00:00 2001 From: Charles Zablit <[email protected]> Date: Mon, 19 Jan 2026 13:57:50 +0000 Subject: [PATCH 3/5] fix formatting --- lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp index ed02f243a5445..0717f4f50a02a 100644 --- a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp +++ b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp @@ -1004,7 +1004,8 @@ class IOHandlerProcessSTDIOWindows : public IOHandler { numRead == 0) goto exit_loop; - // We only care about text input. Consume all non text input events before letting ReadFile handle text input. + // We only care about text input. Consume all non text input events + // before letting ReadFile handle text input. if (inputRecord.EventType == KEY_EVENT && inputRecord.Event.KeyEvent.bKeyDown && inputRecord.Event.KeyEvent.uChar.AsciiChar != 0) >From 4a6e01771e9c7b3081dfa8f6d4b69e01e5397e98 Mon Sep 17 00:00:00 2001 From: Charles Zablit <[email protected]> Date: Mon, 19 Jan 2026 15:50:09 +0000 Subject: [PATCH 4/5] fix control flow --- lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp index 0717f4f50a02a..2afb654775855 100644 --- a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp +++ b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp @@ -1000,8 +1000,7 @@ class IOHandlerProcessSTDIOWindows : public IOHandler { while (true) { INPUT_RECORD inputRecord; DWORD numRead = 0; - if (!PeekConsoleInput(hStdin, &inputRecord, 1, &numRead) || - numRead == 0) + if (!PeekConsoleInput(hStdin, &inputRecord, 1, &numRead)) goto exit_loop; // We only care about text input. Consume all non text input events >From d2b6d061b3f4dee66a89af551ca5f69bbd1669ef Mon Sep 17 00:00:00 2001 From: Charles Zablit <[email protected]> Date: Mon, 19 Jan 2026 17:32:34 +0000 Subject: [PATCH 5/5] fix control flow --- .../Plugins/Process/Windows/Common/ProcessWindows.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp index 2afb654775855..5847d47126b33 100644 --- a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp +++ b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp @@ -985,6 +985,7 @@ class IOHandlerProcessSTDIOWindows : public IOHandler { bool isConsole = GetConsoleMode(hStdin, &consoleMode) != 0; while (true) { + read_loop:; { std::lock_guard<std::mutex> guard(m_mutex); if (GetIsDone()) @@ -1003,6 +1004,9 @@ class IOHandlerProcessSTDIOWindows : public IOHandler { if (!PeekConsoleInput(hStdin, &inputRecord, 1, &numRead)) goto exit_loop; + if (numRead == 0) + goto read_loop; + // We only care about text input. Consume all non text input events // before letting ReadFile handle text input. if (inputRecord.EventType == KEY_EVENT && @@ -1010,8 +1014,7 @@ class IOHandlerProcessSTDIOWindows : public IOHandler { inputRecord.Event.KeyEvent.uChar.AsciiChar != 0) break; - if (!ReadConsoleInput(hStdin, &inputRecord, 1, &numRead) || - numRead == 0) + if (!ReadConsoleInput(hStdin, &inputRecord, 1, &numRead)) goto exit_loop; } } @@ -1045,7 +1048,7 @@ class IOHandlerProcessSTDIOWindows : public IOHandler { } exit_loop:; - SetIsRunning(false); + SetIsRunning(false); } void Cancel() override { _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
