llvm-capstone/lldb/source/Core/StreamFile.cpp
Jonas Devlieghere 948786c929 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
2019-09-23 20:36:46 +00:00

50 lines
1.6 KiB
C++

//===-- StreamFile.cpp ------------------------------------------*- C++ -*-===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
#include "lldb/Core/StreamFile.h"
#include "lldb/Host/FileSystem.h"
#include <stdio.h>
using namespace lldb;
using namespace lldb_private;
// StreamFile constructor
StreamFile::StreamFile() : Stream(), m_file() {}
StreamFile::StreamFile(uint32_t flags, uint32_t addr_size, ByteOrder byte_order)
: Stream(flags, addr_size, byte_order), m_file() {}
StreamFile::StreamFile(int fd, bool transfer_ownership)
: Stream(), m_file(fd, File::eOpenOptionWrite, transfer_ownership) {}
StreamFile::StreamFile(FILE *fh, bool transfer_ownership)
: Stream(), m_file(fh, transfer_ownership) {}
StreamFile::StreamFile(const char *path) : Stream(), m_file() {
FileSystem::Instance().Open(m_file, FileSpec(path),
File::eOpenOptionWrite |
File::eOpenOptionCanCreate |
File::eOpenOptionCloseOnExec);
}
StreamFile::StreamFile(const char *path, uint32_t options, uint32_t permissions)
: Stream(), m_file() {
FileSystem::Instance().Open(m_file, FileSpec(path), options, permissions);
}
StreamFile::~StreamFile() {}
void StreamFile::Flush() { m_file.Flush(); }
size_t StreamFile::WriteImpl(const void *s, size_t length) {
m_file.Write(s, length);
return length;
}