diff options
author | Pavel Labath <pavel@labath.sk> | 2019-03-21 10:21:55 +0000 |
---|---|---|
committer | Pavel Labath <pavel@labath.sk> | 2019-03-21 10:21:55 +0000 |
commit | 045b8544fd2c4e14f7e72e0df2bc681d823b0838 (patch) | |
tree | ba4382bfbeb68c2a72ac25d28eb80baa17068243 /llvm/unittests/Object | |
parent | 0a9541e9ed3fa44fcd36dbbb3fce4deb147d5688 (diff) | |
download | bcm5719-llvm-045b8544fd2c4e14f7e72e0df2bc681d823b0838.tar.gz bcm5719-llvm-045b8544fd2c4e14f7e72e0df2bc681d823b0838.zip |
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.
llvm-svn: 356655
Diffstat (limited to 'llvm/unittests/Object')
-rw-r--r-- | llvm/unittests/Object/CMakeLists.txt | 1 | ||||
-rw-r--r-- | llvm/unittests/Object/MinidumpTest.cpp | 263 |
2 files changed, 130 insertions, 134 deletions
diff --git a/llvm/unittests/Object/CMakeLists.txt b/llvm/unittests/Object/CMakeLists.txt index e0fc6ce8893..e0be1ba2b2f 100644 --- a/llvm/unittests/Object/CMakeLists.txt +++ b/llvm/unittests/Object/CMakeLists.txt @@ -1,4 +1,5 @@ set(LLVM_LINK_COMPONENTS + BinaryFormat Object ) diff --git a/llvm/unittests/Object/MinidumpTest.cpp b/llvm/unittests/Object/MinidumpTest.cpp index 6ebb2a98952..97fde12c0f8 100644 --- a/llvm/unittests/Object/MinidumpTest.cpp +++ b/llvm/unittests/Object/MinidumpTest.cpp @@ -21,19 +21,20 @@ static Expected<std::unique_ptr<MinidumpFile>> create(ArrayRef<uint8_t> Data) { } TEST(MinidumpFile, BasicInterface) { - // 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 + 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'}); + 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(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>()); + 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>()); - // 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>()); + 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>()); - // 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>()); + 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>()); - // 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>()); + 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>()); - // 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>()); + 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>()); - // 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>()); + 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>()); - // 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> 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; |