File::SetDescriptor() should require options

lvm_private::File::GetStream() can fail if m_options == 0

It's not clear from the header a File created with a descriptor will be
not be usable by many parts of LLDB unless SetOptions is also called,
but it is.

This is because those parts of LLDB rely on GetStream() to use the
file, and that in turn relies on calling fdopen on the descriptor. When
calling fdopen, GetStream relies on m_options to determine the access
mode. If m_options has never been set, GetStream() will fail.

This patch adds options as a required argument to File::SetDescriptor
and the corresponding constructor.

Patch by: Lawrence D'Anna

Differential revision: https://reviews.llvm.org/D67792

llvm-svn: 372652
This commit is contained in:
Jonas Devlieghere
2019-09-23 20:36:46 +00:00
parent 4750d79ac6
commit 948786c929
11 changed files with 54 additions and 27 deletions

View File

@@ -1043,9 +1043,9 @@ bool PythonFile::GetUnderlyingFile(File &file) const {
file.Close();
// We don't own the file descriptor returned by this function, make sure the
// File object knows about that.
file.SetDescriptor(PyObject_AsFileDescriptor(m_py_obj), false);
PythonString py_mode = GetAttributeValue("mode").AsType<PythonString>();
file.SetOptions(PythonFile::GetOptionsFromMode(py_mode.GetString()));
auto options = PythonFile::GetOptionsFromMode(py_mode.GetString());
file.SetDescriptor(PyObject_AsFileDescriptor(m_py_obj), options, false);
return file.IsValid();
}