zturner added a comment.
if (!StreamIsValid())
{
if (DescriptorIsValid())
{
const char *mode = GetStreamOpenModeFromOptions (m_options);
if (mode)
{
if (!m_should_close_fd)
{
// We must duplicate the file descriptor if we don't own it
because
// when you call fdopen, the stream will own the fd
#ifdef _WIN32
m_descriptor = ::_dup(GetDescriptor());
#else
m_descriptor = dup(GetDescriptor());
#endif
m_should_close_fd = true;
}
do
{
m_stream = ::fdopen (m_descriptor, mode);
} while (m_stream == NULL && errno == EINTR);
// If we got a stream, then we own the stream and should no
// longer own the descriptor because fclose() will close it for us
if (m_stream)
{
m_own_stream = true;
m_should_close_fd = false;
}
}
}
}
return m_stream;
If this is successful, the final `if (m_stream)` check passes, and it sets
`m_own_stream` to `true`. This means that in the `File` destructor, it will
call `fclose`. It doesn't matter that nobody calls `close`, because after
you've `fdopen`'ed something, you're not supposed to call `close`, only
`fclose`.
Am I missing something?
http://reviews.llvm.org/D18459
_______________________________________________
lldb-commits mailing list
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits