[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