[Lldb-commits] [PATCH] Avoid leaking log file descriptors into the inferior process.

Pavel Labath labath at google.com
Thu Feb 5 08:46:38 PST 2015


REPOSITORY
  rL LLVM

http://reviews.llvm.org/D7412

Files:
  lldb/trunk/include/lldb/Host/File.h
  lldb/trunk/source/Core/StreamFile.cpp
  lldb/trunk/source/Host/common/File.cpp
  lldb/trunk/test/functionalities/avoids-fd-leak/TestFdLeak.py

Index: lldb/trunk/test/functionalities/avoids-fd-leak/TestFdLeak.py
===================================================================
--- lldb/trunk/test/functionalities/avoids-fd-leak/TestFdLeak.py
+++ lldb/trunk/test/functionalities/avoids-fd-leak/TestFdLeak.py
@@ -12,18 +12,30 @@
 
     mydir = TestBase.compute_mydir(__file__)
 
-    @expectedFailureWindows("The check for descriptor leakage needs to be implemented differently")
-    def test_fd_leak (self):
+    @skipIfWindows # The check for descriptor leakage needs to be implemented differently here.
+    def test_fd_leak_basic (self):
+        self.do_test([])
+
+    @skipIfWindows # The check for descriptor leakage needs to be implemented differently here.
+    def test_fd_leak_log (self):
+        self.do_test(["log enable -f '/dev/null' lldb commands"])
+
+    def do_test (self, commands):
         self.buildDefault()
         exe = os.path.join (os.getcwd(), "a.out")
 
+        for c in commands:
+            self.runCmd(c)
+
         target = self.dbg.CreateTarget(exe)
 
         process = target.LaunchSimple (None, None, self.get_process_working_directory())
         self.assertTrue(process, PROCESS_IS_VALID)
 
-        self.assertTrue(process.GetState() == lldb.eStateExited)
-        self.assertTrue(process.GetExitStatus() == 0)
+        self.assertTrue(process.GetState() == lldb.eStateExited, "Process should have exited.")
+        self.assertTrue(process.GetExitStatus() == 0,
+                "Process returned non-zero status. Were incorrect file descriptors passed?")
+
 
 if __name__ == '__main__':
     import atexit
Index: lldb/trunk/include/lldb/Host/File.h
===================================================================
--- lldb/trunk/include/lldb/Host/File.h
+++ lldb/trunk/include/lldb/Host/File.h
@@ -42,7 +42,8 @@
         eOpenOptionNonBlocking          = (1u << 4),    // File reads
         eOpenOptionCanCreate            = (1u << 5),    // Create file if doesn't already exist
         eOpenOptionCanCreateNewOnly     = (1u << 6),    // Can create file only if it doesn't already exist
-        eOpenoptionDontFollowSymlinks   = (1u << 7)
+        eOpenoptionDontFollowSymlinks   = (1u << 7),
+        eOpenOptionCloseOnExec          = (1u << 8)     // Close the file when executing a new process
     };
     
     static mode_t
Index: lldb/trunk/source/Core/StreamFile.cpp
===================================================================
--- lldb/trunk/source/Core/StreamFile.cpp
+++ lldb/trunk/source/Core/StreamFile.cpp
@@ -49,7 +49,8 @@
 
 StreamFile::StreamFile (const char *path) :
     Stream (),
-    m_file (path, File::eOpenOptionWrite | File::eOpenOptionCanCreate, lldb::eFilePermissionsFileDefault)
+    m_file (path, File::eOpenOptionWrite | File::eOpenOptionCanCreate | File::eOpenOptionCloseOnExec,
+                    lldb::eFilePermissionsFileDefault)
 {
 }
 
Index: lldb/trunk/source/Host/common/File.cpp
===================================================================
--- lldb/trunk/source/Host/common/File.cpp
+++ lldb/trunk/source/Host/common/File.cpp
@@ -288,6 +288,8 @@
 #ifndef _WIN32
     if (options & eOpenOptionNonBlocking)
         oflag |= O_NONBLOCK;
+    if (options & eOpenOptionCloseOnExec)
+        oflag |= O_CLOEXEC;
 #else
     oflag |= O_BINARY;
 #endif

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D7412.19413.patch
Type: text/x-patch
Size: 3314 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20150205/27bc9c7b/attachment.bin>


More information about the lldb-commits mailing list