1*76559068SAndroid Build Coastguard Worker //===-- chunk_test.cpp ------------------------------------------*- C++ -*-===//
2*76559068SAndroid Build Coastguard Worker //
3*76559068SAndroid Build Coastguard Worker // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*76559068SAndroid Build Coastguard Worker // See https://llvm.org/LICENSE.txt for license information.
5*76559068SAndroid Build Coastguard Worker // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6*76559068SAndroid Build Coastguard Worker //
7*76559068SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
8*76559068SAndroid Build Coastguard Worker
9*76559068SAndroid Build Coastguard Worker #include "tests/scudo_unit_test.h"
10*76559068SAndroid Build Coastguard Worker
11*76559068SAndroid Build Coastguard Worker #include "chunk.h"
12*76559068SAndroid Build Coastguard Worker
13*76559068SAndroid Build Coastguard Worker #include <stdlib.h>
14*76559068SAndroid Build Coastguard Worker
15*76559068SAndroid Build Coastguard Worker static constexpr scudo::uptr HeaderSize = scudo::Chunk::getHeaderSize();
16*76559068SAndroid Build Coastguard Worker static constexpr scudo::u32 Cookie = 0x41424344U;
17*76559068SAndroid Build Coastguard Worker static constexpr scudo::u32 InvalidCookie = 0x11223344U;
18*76559068SAndroid Build Coastguard Worker
initChecksum(void)19*76559068SAndroid Build Coastguard Worker static void initChecksum(void) {
20*76559068SAndroid Build Coastguard Worker if (&scudo::computeHardwareCRC32 && scudo::hasHardwareCRC32())
21*76559068SAndroid Build Coastguard Worker scudo::HashAlgorithm = scudo::Checksum::HardwareCRC32;
22*76559068SAndroid Build Coastguard Worker }
23*76559068SAndroid Build Coastguard Worker
TEST(ScudoChunkDeathTest,ChunkBasic)24*76559068SAndroid Build Coastguard Worker TEST(ScudoChunkDeathTest, ChunkBasic) {
25*76559068SAndroid Build Coastguard Worker initChecksum();
26*76559068SAndroid Build Coastguard Worker const scudo::uptr Size = 0x100U;
27*76559068SAndroid Build Coastguard Worker scudo::Chunk::UnpackedHeader Header = {};
28*76559068SAndroid Build Coastguard Worker void *Block = malloc(HeaderSize + Size);
29*76559068SAndroid Build Coastguard Worker void *P = reinterpret_cast<void *>(reinterpret_cast<scudo::uptr>(Block) +
30*76559068SAndroid Build Coastguard Worker HeaderSize);
31*76559068SAndroid Build Coastguard Worker scudo::Chunk::storeHeader(Cookie, P, &Header);
32*76559068SAndroid Build Coastguard Worker memset(P, 'A', Size);
33*76559068SAndroid Build Coastguard Worker scudo::Chunk::loadHeader(Cookie, P, &Header);
34*76559068SAndroid Build Coastguard Worker EXPECT_TRUE(scudo::Chunk::isValid(Cookie, P, &Header));
35*76559068SAndroid Build Coastguard Worker EXPECT_FALSE(scudo::Chunk::isValid(InvalidCookie, P, &Header));
36*76559068SAndroid Build Coastguard Worker EXPECT_DEATH(scudo::Chunk::loadHeader(InvalidCookie, P, &Header), "");
37*76559068SAndroid Build Coastguard Worker free(Block);
38*76559068SAndroid Build Coastguard Worker }
39*76559068SAndroid Build Coastguard Worker
TEST(ScudoChunkDeathTest,CorruptHeader)40*76559068SAndroid Build Coastguard Worker TEST(ScudoChunkDeathTest, CorruptHeader) {
41*76559068SAndroid Build Coastguard Worker initChecksum();
42*76559068SAndroid Build Coastguard Worker const scudo::uptr Size = 0x100U;
43*76559068SAndroid Build Coastguard Worker scudo::Chunk::UnpackedHeader Header = {};
44*76559068SAndroid Build Coastguard Worker void *Block = malloc(HeaderSize + Size);
45*76559068SAndroid Build Coastguard Worker void *P = reinterpret_cast<void *>(reinterpret_cast<scudo::uptr>(Block) +
46*76559068SAndroid Build Coastguard Worker HeaderSize);
47*76559068SAndroid Build Coastguard Worker scudo::Chunk::storeHeader(Cookie, P, &Header);
48*76559068SAndroid Build Coastguard Worker memset(P, 'A', Size);
49*76559068SAndroid Build Coastguard Worker scudo::Chunk::loadHeader(Cookie, P, &Header);
50*76559068SAndroid Build Coastguard Worker // Simulate a couple of corrupted bits per byte of header data.
51*76559068SAndroid Build Coastguard Worker for (scudo::uptr I = 0; I < sizeof(scudo::Chunk::PackedHeader); I++) {
52*76559068SAndroid Build Coastguard Worker *(reinterpret_cast<scudo::u8 *>(Block) + I) ^= 0x42U;
53*76559068SAndroid Build Coastguard Worker EXPECT_DEATH(scudo::Chunk::loadHeader(Cookie, P, &Header), "");
54*76559068SAndroid Build Coastguard Worker *(reinterpret_cast<scudo::u8 *>(Block) + I) ^= 0x42U;
55*76559068SAndroid Build Coastguard Worker }
56*76559068SAndroid Build Coastguard Worker free(Block);
57*76559068SAndroid Build Coastguard Worker }
58