
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
58 lines
1.8 KiB
C++
58 lines
1.8 KiB
C++
//===-- FileTest.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/Host/File.h"
|
|
#include "llvm/ADT/SmallString.h"
|
|
#include "llvm/Support/FileSystem.h"
|
|
#include "llvm/Support/FileUtilities.h"
|
|
#include "llvm/Support/Path.h"
|
|
#include "llvm/Support/Program.h"
|
|
#include "gtest/gtest.h"
|
|
|
|
using namespace lldb;
|
|
using namespace lldb_private;
|
|
|
|
TEST(File, GetWaitableHandleFileno) {
|
|
const auto *Info = testing::UnitTest::GetInstance()->current_test_info();
|
|
|
|
llvm::SmallString<128> name;
|
|
int fd;
|
|
llvm::sys::fs::createTemporaryFile(llvm::Twine(Info->test_case_name()) + "-" +
|
|
Info->name(),
|
|
"test", fd, name);
|
|
llvm::FileRemover remover(name);
|
|
ASSERT_GE(fd, 0);
|
|
|
|
FILE *stream = fdopen(fd, "r");
|
|
ASSERT_TRUE(stream);
|
|
|
|
File file(stream, true);
|
|
EXPECT_EQ(file.GetWaitableHandle(), fd);
|
|
}
|
|
|
|
TEST(File, GetStreamFromDescriptor) {
|
|
const auto *Info = testing::UnitTest::GetInstance()->current_test_info();
|
|
llvm::SmallString<128> name;
|
|
int fd;
|
|
llvm::sys::fs::createTemporaryFile(llvm::Twine(Info->test_case_name()) + "-" +
|
|
Info->name(),
|
|
"test", fd, name);
|
|
|
|
llvm::FileRemover remover(name);
|
|
ASSERT_GE(fd, 0);
|
|
|
|
File file(fd, File::eOpenOptionWrite, true);
|
|
ASSERT_TRUE(file.IsValid());
|
|
|
|
FILE *stream = file.GetStream();
|
|
ASSERT_TRUE(stream != NULL);
|
|
|
|
EXPECT_EQ(file.GetDescriptor(), fd);
|
|
EXPECT_EQ(file.GetWaitableHandle(), fd);
|
|
}
|