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

Greg Clayton clayborg at gmail.com
Fri Feb 6 09:44:56 PST 2015


Looks good.

> On Feb 6, 2015, at 6:21 AM, Pavel Labath <labath at google.com> wrote:
> 
> Hi clayborg, vharron,
> 
> 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.
> 
> http://reviews.llvm.org/D7466
> 
> Files:
>  source/Utility/PseudoTerminal.cpp
>  test/functionalities/avoids-fd-leak/TestFdLeak.py
> 
> Index: source/Utility/PseudoTerminal.cpp
> ===================================================================
> --- source/Utility/PseudoTerminal.cpp
> +++ source/Utility/PseudoTerminal.cpp
> @@ -239,7 +239,7 @@
>         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 @@
>             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)
> Index: test/functionalities/avoids-fd-leak/TestFdLeak.py
> ===================================================================
> --- test/functionalities/avoids-fd-leak/TestFdLeak.py
> +++ test/functionalities/avoids-fd-leak/TestFdLeak.py
> @@ -36,6 +36,29 @@
>         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
> 
> EMAIL PREFERENCES
>  http://reviews.llvm.org/settings/panel/emailpreferences/
> <D7466.19482.patch>





More information about the lldb-commits mailing list