Author: Nerixyz
Date: 2026-01-20T22:47:42+01:00
New Revision: d3779111b5316bb3a36ff5b0a04311d1128d65c0

URL: 
https://github.com/llvm/llvm-project/commit/d3779111b5316bb3a36ff5b0a04311d1128d65c0
DIFF: 
https://github.com/llvm/llvm-project/commit/d3779111b5316bb3a36ff5b0a04311d1128d65c0.diff

LOG: [LLDB] Close previously opened handles in `PseudoConsole` (#176775)

In
https://github.com/llvm/llvm-project/pull/175837#issuecomment-3749408432
I mentioned that any handles that were previously opened and haven't
been closed since, won't be closed in the destructor nor in
`OpenPseudoConsole`.

In this PR, I added `Close` calls to these methods. Calling `Close()` is
a no-op if the handles are invalid.

Added: 
    

Modified: 
    lldb/include/lldb/Host/windows/PseudoConsole.h
    lldb/source/Host/windows/PseudoConsole.cpp

Removed: 
    


################################################################################
diff  --git a/lldb/include/lldb/Host/windows/PseudoConsole.h 
b/lldb/include/lldb/Host/windows/PseudoConsole.h
index c3bf817cf831d..039783985c025 100644
--- a/lldb/include/lldb/Host/windows/PseudoConsole.h
+++ b/lldb/include/lldb/Host/windows/PseudoConsole.h
@@ -21,6 +21,14 @@ namespace lldb_private {
 class PseudoConsole {
 
 public:
+  PseudoConsole() = default;
+  ~PseudoConsole();
+
+  PseudoConsole(const PseudoConsole &) = delete;
+  PseudoConsole(PseudoConsole &&) = delete;
+  PseudoConsole &operator=(const PseudoConsole &) = delete;
+  PseudoConsole &operator=(PseudoConsole &&) = delete;
+
   llvm::Error OpenPseudoConsole();
 
   /// Close the ConPTY, its read/write handles and invalidate them.

diff  --git a/lldb/source/Host/windows/PseudoConsole.cpp 
b/lldb/source/Host/windows/PseudoConsole.cpp
index 9204488930a3e..b3314fd58bbb8 100644
--- a/lldb/source/Host/windows/PseudoConsole.cpp
+++ b/lldb/source/Host/windows/PseudoConsole.cpp
@@ -64,10 +64,16 @@ struct Kernel32 {
 
 static Kernel32 kernel32;
 
+PseudoConsole::~PseudoConsole() { Close(); }
+
 llvm::Error PseudoConsole::OpenPseudoConsole() {
   if (!kernel32.IsConPTYAvailable())
     return llvm::make_error<llvm::StringError>("ConPTY is not available",
                                                llvm::errc::io_error);
+
+  // close any previously opened handles
+  Close();
+
   HRESULT hr;
   HANDLE hInputRead = INVALID_HANDLE_VALUE;
   HANDLE hInputWrite = INVALID_HANDLE_VALUE;
@@ -118,8 +124,11 @@ llvm::Error PseudoConsole::OpenPseudoConsole() {
 void PseudoConsole::Close() {
   if (m_conpty_handle != INVALID_HANDLE_VALUE)
     kernel32.ClosePseudoConsole(m_conpty_handle);
-  CloseHandle(m_conpty_input);
-  CloseHandle(m_conpty_output);
+  if (m_conpty_input != INVALID_HANDLE_VALUE)
+    CloseHandle(m_conpty_input);
+  if (m_conpty_output != INVALID_HANDLE_VALUE)
+    CloseHandle(m_conpty_output);
+
   m_conpty_handle = INVALID_HANDLE_VALUE;
   m_conpty_input = INVALID_HANDLE_VALUE;
   m_conpty_output = INVALID_HANDLE_VALUE;


        
_______________________________________________
lldb-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits

Reply via email to