[llvm] r356655 - Fix two more issues with r356652
Pavel Labath via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 21 03:21:55 PDT 2019
Author: labath
Date: Thu Mar 21 03:21:55 2019
New Revision: 356655
URL: http://llvm.org/viewvc/llvm-project?rev=356655&view=rev
Log:
Fix two more issues with r356652
The first problem was a use-after-free in the tests (detected by asan
bots). The temporary array created for the "create" call is guaranteed
to live only until the end of the statement. The fix there is to store
the test data in a local variable to ensure it has the right lifetime
The second issue is broken BUILD_SHARED_LIBS build, which I fix by
adding the appropriate BinaryFormat dependency to the Object unit tests.
Modified:
llvm/trunk/unittests/Object/CMakeLists.txt
llvm/trunk/unittests/Object/MinidumpTest.cpp
Modified: llvm/trunk/unittests/Object/CMakeLists.txt
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Object/CMakeLists.txt?rev=356655&r1=356654&r2=356655&view=diff
==============================================================================
--- llvm/trunk/unittests/Object/CMakeLists.txt (original)
+++ llvm/trunk/unittests/Object/CMakeLists.txt Thu Mar 21 03:21:55 2019
@@ -1,4 +1,5 @@
set(LLVM_LINK_COMPONENTS
+ BinaryFormat
Object
)
Modified: llvm/trunk/unittests/Object/MinidumpTest.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/Object/MinidumpTest.cpp?rev=356655&r1=356654&r2=356655&view=diff
==============================================================================
--- llvm/trunk/unittests/Object/MinidumpTest.cpp (original)
+++ llvm/trunk/unittests/Object/MinidumpTest.cpp Thu Mar 21 03:21:55 2019
@@ -21,19 +21,20 @@ static Expected<std::unique_ptr<Minidump
}
TEST(MinidumpFile, BasicInterface) {
+ std::vector<uint8_t> Data{ // Header
+ 'M', 'D', 'M', 'P', // Signature
+ 0x93, 0xa7, 0, 0, // Version
+ 1, 0, 0, 0, // NumberOfStreams,
+ 0x20, 0, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
+ 0x2c, 0, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
// A very simple minidump file which contains just a single stream.
- auto ExpectedFile =
- create({ // Header
- 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
- 1, 0, 0, 0, // NumberOfStreams,
- 0x20, 0, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
- 0x2c, 0, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'});
+ auto ExpectedFile = create(Data);
ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());
const MinidumpFile &File = **ExpectedFile;
const Header &H = File.header();
@@ -60,135 +61,127 @@ TEST(MinidumpFile, BasicInterface) {
// Use the input from the previous test, but corrupt it in various ways
TEST(MinidumpFile, create_ErrorCases) {
- // File too short
- EXPECT_THAT_EXPECTED(create({'M', 'D', 'M', 'P'}), Failed<BinaryError>());
+ std::vector<uint8_t> FileTooShort{'M', 'D', 'M', 'P'};
+ EXPECT_THAT_EXPECTED(create(FileTooShort), Failed<BinaryError>());
- // Wrong Signature
- EXPECT_THAT_EXPECTED(
- create({ // Header
- '!', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
- 1, 0, 0, 0, // NumberOfStreams,
- 0x20, 0, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
- 0x2c, 0, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'}),
- Failed<BinaryError>());
-
- // Wrong Version
- EXPECT_THAT_EXPECTED(
- create({ // Header
- 'M', 'D', 'M', 'P', 0x39, 0xa7, 0, 0, // Signature, Version
- 1, 0, 0, 0, // NumberOfStreams,
- 0x20, 0, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
- 0x2c, 0, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'}),
- Failed<BinaryError>());
-
- // Stream directory after EOF
- EXPECT_THAT_EXPECTED(
- create({ // Header
- 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
- 1, 0, 0, 0, // NumberOfStreams,
- 0x20, 1, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
- 0x2c, 0, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'}),
- Failed<BinaryError>());
-
- // Truncated stream directory
- EXPECT_THAT_EXPECTED(
- create({ // Header
- 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
- 1, 1, 0, 0, // NumberOfStreams,
- 0x20, 0, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
- 0x2c, 0, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'}),
- Failed<BinaryError>());
-
- // Stream0 after EOF
- EXPECT_THAT_EXPECTED(
- create({ // Header
- 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
- 1, 0, 0, 0, // NumberOfStreams,
- 0x20, 0, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
- 0x2c, 1, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'}),
- Failed<BinaryError>());
-
- // Truncated Stream0
- EXPECT_THAT_EXPECTED(
- create({ // Header
- 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
- 1, 0, 0, 0, // NumberOfStreams,
- 0x20, 0, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 3, 0, 0x67, 0x47, 8, 0, 0, 0, // Type, DataSize,
- 0x2c, 0, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'}),
- Failed<BinaryError>());
-
- // Duplicate Stream
- EXPECT_THAT_EXPECTED(
- create({ // Header
- 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
- 2, 0, 0, 0, // NumberOfStreams,
- 0x20, 0, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
- 0x40, 0, 0, 0, // RVA
- // Stream
- 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
- 0x40, 0, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'}),
- Failed<BinaryError>());
-
- // Stream matching one of the DenseMapInfo magic values
- EXPECT_THAT_EXPECTED(
- create({ // Header
- 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
- 1, 0, 0, 0, // NumberOfStreams,
- 0x20, 0, 0, 0, // StreamDirectoryRVA
- 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
- 8, 9, 0, 1, 2, 3, 4, 5, // Flags
- // Stream Directory
- 0xff, 0xff, 0xff, 0xff, 7, 0, 0, 0, // Type, DataSize,
- 0x2c, 0, 0, 0, // RVA
- // Stream
- 'C', 'P', 'U', 'I', 'N', 'F', 'O'}),
- Failed<BinaryError>());
+ std::vector<uint8_t> WrongSignature{
+ // Header
+ '!', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
+ 1, 0, 0, 0, // NumberOfStreams,
+ 0x20, 0, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
+ 0x2c, 0, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ EXPECT_THAT_EXPECTED(create(WrongSignature), Failed<BinaryError>());
+
+ std::vector<uint8_t> WrongVersion{
+ // Header
+ 'M', 'D', 'M', 'P', 0x39, 0xa7, 0, 0, // Signature, Version
+ 1, 0, 0, 0, // NumberOfStreams,
+ 0x20, 0, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
+ 0x2c, 0, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ EXPECT_THAT_EXPECTED(create(WrongVersion), Failed<BinaryError>());
+
+ std::vector<uint8_t> DirectoryAfterEOF{
+ // Header
+ 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
+ 1, 0, 0, 0, // NumberOfStreams,
+ 0x20, 1, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
+ 0x2c, 0, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ EXPECT_THAT_EXPECTED(create(DirectoryAfterEOF), Failed<BinaryError>());
+
+ std::vector<uint8_t> TruncatedDirectory{
+ // Header
+ 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
+ 1, 1, 0, 0, // NumberOfStreams,
+ 0x20, 0, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
+ 0x2c, 0, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ EXPECT_THAT_EXPECTED(create(TruncatedDirectory), Failed<BinaryError>());
+
+ std::vector<uint8_t> Stream0AfterEOF{
+ // Header
+ 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
+ 1, 0, 0, 0, // NumberOfStreams,
+ 0x20, 0, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
+ 0x2c, 1, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ EXPECT_THAT_EXPECTED(create(Stream0AfterEOF), Failed<BinaryError>());
+
+ std::vector<uint8_t> Stream0Truncated{
+ // Header
+ 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
+ 1, 0, 0, 0, // NumberOfStreams,
+ 0x20, 0, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 3, 0, 0x67, 0x47, 8, 0, 0, 0, // Type, DataSize,
+ 0x2c, 0, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ EXPECT_THAT_EXPECTED(create(Stream0Truncated), Failed<BinaryError>());
+
+ std::vector<uint8_t> DuplicateStream{
+ // Header
+ 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
+ 2, 0, 0, 0, // NumberOfStreams,
+ 0x20, 0, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
+ 0x40, 0, 0, 0, // RVA
+ // Stream
+ 3, 0, 0x67, 0x47, 7, 0, 0, 0, // Type, DataSize,
+ 0x40, 0, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ EXPECT_THAT_EXPECTED(create(DuplicateStream), Failed<BinaryError>());
+
+ std::vector<uint8_t> DenseMapInfoConflict{
+ // Header
+ 'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
+ 1, 0, 0, 0, // NumberOfStreams,
+ 0x20, 0, 0, 0, // StreamDirectoryRVA
+ 0, 1, 2, 3, 4, 5, 6, 7, // Checksum, TimeDateStamp
+ 8, 9, 0, 1, 2, 3, 4, 5, // Flags
+ // Stream Directory
+ 0xff, 0xff, 0xff, 0xff, 7, 0, 0, 0, // Type, DataSize,
+ 0x2c, 0, 0, 0, // RVA
+ // Stream
+ 'C', 'P', 'U', 'I', 'N', 'F', 'O'};
+ EXPECT_THAT_EXPECTED(create(DenseMapInfoConflict), Failed<BinaryError>());
}
TEST(MinidumpFile, IngoresDummyStreams) {
- auto ExpectedFile = create({
+ std::vector<uint8_t> TwoDummyStreams{
// Header
'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
2, 0, 0, 0, // NumberOfStreams,
@@ -200,7 +193,8 @@ TEST(MinidumpFile, IngoresDummyStreams)
0x20, 0, 0, 0, // RVA
0, 0, 0, 0, 0, 0, 0, 0, // Type, DataSize,
0x20, 0, 0, 0, // RVA
- });
+ };
+ auto ExpectedFile = create(TwoDummyStreams);
ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());
const MinidumpFile &File = **ExpectedFile;
ASSERT_EQ(2u, File.streams().size());
@@ -210,7 +204,7 @@ TEST(MinidumpFile, IngoresDummyStreams)
}
TEST(MinidumpFile, getSystemInfo) {
- auto ExpectedFile = create({
+ std::vector<uint8_t> Data{
// Header
'M', 'D', 'M', 'P', 0x93, 0xa7, 0, 0, // Signature, Version
1, 0, 0, 0, // NumberOfStreams,
@@ -229,7 +223,8 @@ TEST(MinidumpFile, getSystemInfo) {
'L', 'L', 'V', 'M', 'L', 'L', 'V', 'M', 'L', 'L', 'V', 'M', // VendorID
1, 2, 3, 4, 5, 6, 7, 8, // VersionInfo, FeatureInfo
9, 0, 1, 2, // AMDExtendedFeatures
- });
+ };
+ auto ExpectedFile = create(Data);
ASSERT_THAT_EXPECTED(ExpectedFile, Succeeded());
const MinidumpFile &File = **ExpectedFile;
More information about the llvm-commits
mailing list