[Lldb-commits] [lldb] [lldb][windows] fix race condition in ConPTY on process exit (PR #194631)

Charles Zablit via lldb-commits lldb-commits at lists.llvm.org
Tue Apr 28 07:18:52 PDT 2026


https://github.com/charles-zablit updated https://github.com/llvm/llvm-project/pull/194631

>From 48ecd610697a26e02ea09541107bab1b7587271d Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Tue, 28 Apr 2026 14:39:47 +0100
Subject: [PATCH 1/2] [lldb][windows] fix race condition in ConPTY on process
 exit

---
 lldb/source/Host/windows/ConnectionConPTYWindows.cpp       | 7 ++++++-
 .../Plugins/Process/Windows/Common/ProcessWindows.cpp      | 3 ++-
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/lldb/source/Host/windows/ConnectionConPTYWindows.cpp b/lldb/source/Host/windows/ConnectionConPTYWindows.cpp
index 39ca3522cb947..c49aae7b3104e 100644
--- a/lldb/source/Host/windows/ConnectionConPTYWindows.cpp
+++ b/lldb/source/Host/windows/ConnectionConPTYWindows.cpp
@@ -65,8 +65,13 @@ size_t ConnectionConPTY::Read(void *dst, size_t dst_len,
                               lldb::ConnectionStatus &status,
                               Status *error_ptr) {
   std::unique_lock<std::mutex> guard(m_pty->GetMutex());
-  if (m_pty->IsStopping()) {
+  if (m_pty->IsStopping())
     m_pty->GetCV().wait(guard, [this] { return !m_pty->IsStopping(); });
+  guard.unlock();
+
+  if (!m_pty->IsConnected()) {
+    status = eConnectionStatusEndOfFile;
+    return 0;
   }
 
   size_t bytes_read =
diff --git a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp
index c0c8be8bd62b8..e5c4ed991e3bf 100644
--- a/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp
+++ b/lldb/source/Plugins/Process/Windows/Common/ProcessWindows.cpp
@@ -656,8 +656,9 @@ void ProcessWindows::OnExitProcess(uint32_t exit_code) {
 
   if (m_pty) {
     m_pty->SetStopping(true);
-    m_stdio_communication.InterruptRead();
     m_pty->Close();
+    m_stdio_communication.InterruptRead();
+    m_stdio_communication.StopReadThread();
   }
 
   TargetSP target = CalculateTarget();

>From 930279d33dedeb66c26c624bc439a68816a699e6 Mon Sep 17 00:00:00 2001
From: Charles Zablit <c_zablit at apple.com>
Date: Tue, 28 Apr 2026 15:18:36 +0100
Subject: [PATCH 2/2] fixup! [lldb][windows] fix race condition in ConPTY on
 process exit

---
 .../Host/windows/ConnectionConPTYWindows.cpp     | 16 ++++++++--------
 1 file changed, 8 insertions(+), 8 deletions(-)

diff --git a/lldb/source/Host/windows/ConnectionConPTYWindows.cpp b/lldb/source/Host/windows/ConnectionConPTYWindows.cpp
index c49aae7b3104e..08e2406a93af0 100644
--- a/lldb/source/Host/windows/ConnectionConPTYWindows.cpp
+++ b/lldb/source/Host/windows/ConnectionConPTYWindows.cpp
@@ -64,14 +64,14 @@ size_t ConnectionConPTY::Read(void *dst, size_t dst_len,
                               const Timeout<std::micro> &timeout,
                               lldb::ConnectionStatus &status,
                               Status *error_ptr) {
-  std::unique_lock<std::mutex> guard(m_pty->GetMutex());
-  if (m_pty->IsStopping())
-    m_pty->GetCV().wait(guard, [this] { return !m_pty->IsStopping(); });
-  guard.unlock();
-
-  if (!m_pty->IsConnected()) {
-    status = eConnectionStatusEndOfFile;
-    return 0;
+  {
+    std::unique_lock<std::mutex> guard(m_pty->GetMutex());
+    if (m_pty->IsStopping())
+      m_pty->GetCV().wait(guard, [this] { return !m_pty->IsStopping(); });
+    if (!m_pty->IsConnected()) {
+      status = eConnectionStatusEndOfFile;
+      return 0;
+    }
   }
 
   size_t bytes_read =



More information about the lldb-commits mailing list