[Lldb-commits] [lldb] r228570 - Fix descriptor leak in multi-target debugging

Pavel Labath labath at google.com
Mon Feb 9 03:37:57 PST 2015


Author: labath
Date: Mon Feb  9 05:37:56 2015
New Revision: 228570

URL: http://llvm.org/viewvc/llvm-project?rev=228570&view=rev
Log:
Fix descriptor leak in multi-target debugging

Summary:
When debugging two targets concurrently, the pseude terminal master fd from the first one would
leak into the second. This fixes the problem by setting O_CLOEXEC on the master fd. Test
included.

Reviewers: clayborg, vharron

Subscribers: lldb-commits

Differential Revision: http://reviews.llvm.org/D7466

Modified:
    lldb/trunk/source/Utility/PseudoTerminal.cpp
    lldb/trunk/test/functionalities/avoids-fd-leak/TestFdLeak.py

Modified: lldb/trunk/source/Utility/PseudoTerminal.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Utility/PseudoTerminal.cpp?rev=228570&r1=228569&r2=228570&view=diff
==============================================================================
--- lldb/trunk/source/Utility/PseudoTerminal.cpp (original)
+++ lldb/trunk/source/Utility/PseudoTerminal.cpp Mon Feb  9 05:37:56 2015
@@ -239,7 +239,7 @@ PseudoTerminal::Fork (char *error_str, s
         error_str[0] = '\0';
 
     pid_t pid = LLDB_INVALID_PROCESS_ID;
-    if (OpenFirstAvailableMaster (O_RDWR, error_str, error_len))
+    if (OpenFirstAvailableMaster (O_RDWR | O_CLOEXEC, error_str, error_len))
     {
         // Successfully opened our master pseudo terminal
 
@@ -258,7 +258,8 @@ PseudoTerminal::Fork (char *error_str, s
             if (OpenSlave (O_RDWR, error_str, error_len))
             {
                 // Successfully opened slave
-                // We are done with the master in the child process so lets close it
+
+                // Master FD should have O_CLOEXEC set, but let's close it just in case...
                 CloseMasterFileDescriptor ();
 
 #if defined(TIOCSCTTY)

Modified: lldb/trunk/test/functionalities/avoids-fd-leak/TestFdLeak.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/test/functionalities/avoids-fd-leak/TestFdLeak.py?rev=228570&r1=228569&r2=228570&view=diff
==============================================================================
--- lldb/trunk/test/functionalities/avoids-fd-leak/TestFdLeak.py (original)
+++ lldb/trunk/test/functionalities/avoids-fd-leak/TestFdLeak.py Mon Feb  9 05:37:56 2015
@@ -36,6 +36,29 @@ class AvoidsFdLeakTestCase(TestBase):
         self.assertTrue(process.GetExitStatus() == 0,
                 "Process returned non-zero status. Were incorrect file descriptors passed?")
 
+    @skipIfWindows # The check for descriptor leakage needs to be implemented differently here.
+    def test_fd_leak_multitarget (self):
+        self.buildDefault()
+        exe = os.path.join (os.getcwd(), "a.out")
+
+        target = self.dbg.CreateTarget(exe)
+
+        listener = lldb.SBListener()
+        error = lldb.SBError()
+        process1 = target.Launch (listener, None, None, None, None, None,
+                self.get_process_working_directory(), 0, True, # stop at entry
+                error)
+        self.assertTrue(process1, PROCESS_IS_VALID)
+        self.assertTrue(process1.GetState() == lldb.eStateStopped, "Process should have been stopped.")
+
+        target2 = self.dbg.CreateTarget(exe)
+        process2 = target2.LaunchSimple (None, None, self.get_process_working_directory())
+        self.assertTrue(process2, PROCESS_IS_VALID)
+
+        self.assertTrue(process2.GetState() == lldb.eStateExited, "Process should have exited.")
+        self.assertTrue(process2.GetExitStatus() == 0,
+                "Process returned non-zero status. Were incorrect file descriptors passed?")
+
 
 if __name__ == '__main__':
     import atexit





More information about the lldb-commits mailing list