xref: /llvm-project/compiler-rt/lib/scudo/standalone/tests/chunk_test.cpp (revision 54ddd0762bd0dac31c9e2732bf807cea1785f091)
13fa38318SNico Weber //===-- chunk_test.cpp ------------------------------------------*- C++ -*-===//
23fa38318SNico Weber //
33fa38318SNico Weber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43fa38318SNico Weber // See https://llvm.org/LICENSE.txt for license information.
53fa38318SNico Weber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63fa38318SNico Weber //
73fa38318SNico Weber //===----------------------------------------------------------------------===//
83fa38318SNico Weber 
90d3d4d3bSKostya Kortchinsky #include "tests/scudo_unit_test.h"
103fa38318SNico Weber 
110d3d4d3bSKostya Kortchinsky #include "chunk.h"
123fa38318SNico Weber 
133fa38318SNico Weber #include <stdlib.h>
143fa38318SNico Weber 
153fa38318SNico Weber static constexpr scudo::uptr HeaderSize = scudo::Chunk::getHeaderSize();
163fa38318SNico Weber static constexpr scudo::u32 Cookie = 0x41424344U;
173fa38318SNico Weber static constexpr scudo::u32 InvalidCookie = 0x11223344U;
183fa38318SNico Weber 
initChecksum(void)193fa38318SNico Weber static void initChecksum(void) {
203fa38318SNico Weber   if (&scudo::computeHardwareCRC32 && scudo::hasHardwareCRC32())
213fa38318SNico Weber     scudo::HashAlgorithm = scudo::Checksum::HardwareCRC32;
223fa38318SNico Weber }
233fa38318SNico Weber 
TEST(ScudoChunkDeathTest,ChunkBasic)24*dd1c4bd0SMitch Phillips TEST(ScudoChunkDeathTest, ChunkBasic) {
253fa38318SNico Weber   initChecksum();
263fa38318SNico Weber   const scudo::uptr Size = 0x100U;
273fa38318SNico Weber   scudo::Chunk::UnpackedHeader Header = {};
283fa38318SNico Weber   void *Block = malloc(HeaderSize + Size);
293fa38318SNico Weber   void *P = reinterpret_cast<void *>(reinterpret_cast<scudo::uptr>(Block) +
303fa38318SNico Weber                                      HeaderSize);
313fa38318SNico Weber   scudo::Chunk::storeHeader(Cookie, P, &Header);
323fa38318SNico Weber   memset(P, 'A', Size);
333fa38318SNico Weber   scudo::Chunk::loadHeader(Cookie, P, &Header);
343fa38318SNico Weber   EXPECT_TRUE(scudo::Chunk::isValid(Cookie, P, &Header));
353fa38318SNico Weber   EXPECT_FALSE(scudo::Chunk::isValid(InvalidCookie, P, &Header));
363fa38318SNico Weber   EXPECT_DEATH(scudo::Chunk::loadHeader(InvalidCookie, P, &Header), "");
373fa38318SNico Weber   free(Block);
383fa38318SNico Weber }
393fa38318SNico Weber 
TEST(ScudoChunkDeathTest,CorruptHeader)40*dd1c4bd0SMitch Phillips TEST(ScudoChunkDeathTest, CorruptHeader) {
413fa38318SNico Weber   initChecksum();
423fa38318SNico Weber   const scudo::uptr Size = 0x100U;
433fa38318SNico Weber   scudo::Chunk::UnpackedHeader Header = {};
443fa38318SNico Weber   void *Block = malloc(HeaderSize + Size);
453fa38318SNico Weber   void *P = reinterpret_cast<void *>(reinterpret_cast<scudo::uptr>(Block) +
463fa38318SNico Weber                                      HeaderSize);
473fa38318SNico Weber   scudo::Chunk::storeHeader(Cookie, P, &Header);
483fa38318SNico Weber   memset(P, 'A', Size);
493fa38318SNico Weber   scudo::Chunk::loadHeader(Cookie, P, &Header);
503fa38318SNico Weber   // Simulate a couple of corrupted bits per byte of header data.
513fa38318SNico Weber   for (scudo::uptr I = 0; I < sizeof(scudo::Chunk::PackedHeader); I++) {
523fa38318SNico Weber     *(reinterpret_cast<scudo::u8 *>(Block) + I) ^= 0x42U;
533fa38318SNico Weber     EXPECT_DEATH(scudo::Chunk::loadHeader(Cookie, P, &Header), "");
543fa38318SNico Weber     *(reinterpret_cast<scudo::u8 *>(Block) + I) ^= 0x42U;
553fa38318SNico Weber   }
563fa38318SNico Weber   free(Block);
573fa38318SNico Weber }
58