1*76559068SAndroid Build Coastguard Worker //===-- map_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 "common.h"
12*76559068SAndroid Build Coastguard Worker #include "mem_map.h"
13*76559068SAndroid Build Coastguard Worker
14*76559068SAndroid Build Coastguard Worker #include <string.h>
15*76559068SAndroid Build Coastguard Worker #include <unistd.h>
16*76559068SAndroid Build Coastguard Worker
17*76559068SAndroid Build Coastguard Worker static const char *MappingName = "scudo:test";
18*76559068SAndroid Build Coastguard Worker
TEST(ScudoMapTest,PageSize)19*76559068SAndroid Build Coastguard Worker TEST(ScudoMapTest, PageSize) {
20*76559068SAndroid Build Coastguard Worker EXPECT_EQ(scudo::getPageSizeCached(),
21*76559068SAndroid Build Coastguard Worker static_cast<scudo::uptr>(sysconf(_SC_PAGESIZE)));
22*76559068SAndroid Build Coastguard Worker }
23*76559068SAndroid Build Coastguard Worker
TEST(ScudoMapDeathTest,MapNoAccessUnmap)24*76559068SAndroid Build Coastguard Worker TEST(ScudoMapDeathTest, MapNoAccessUnmap) {
25*76559068SAndroid Build Coastguard Worker const scudo::uptr Size = 4 * scudo::getPageSizeCached();
26*76559068SAndroid Build Coastguard Worker scudo::ReservedMemoryT ReservedMemory;
27*76559068SAndroid Build Coastguard Worker
28*76559068SAndroid Build Coastguard Worker ASSERT_TRUE(ReservedMemory.create(/*Addr=*/0U, Size, MappingName));
29*76559068SAndroid Build Coastguard Worker EXPECT_NE(ReservedMemory.getBase(), 0U);
30*76559068SAndroid Build Coastguard Worker EXPECT_DEATH(
31*76559068SAndroid Build Coastguard Worker memset(reinterpret_cast<void *>(ReservedMemory.getBase()), 0xaa, Size),
32*76559068SAndroid Build Coastguard Worker "");
33*76559068SAndroid Build Coastguard Worker
34*76559068SAndroid Build Coastguard Worker ReservedMemory.release();
35*76559068SAndroid Build Coastguard Worker }
36*76559068SAndroid Build Coastguard Worker
TEST(ScudoMapDeathTest,MapUnmap)37*76559068SAndroid Build Coastguard Worker TEST(ScudoMapDeathTest, MapUnmap) {
38*76559068SAndroid Build Coastguard Worker const scudo::uptr Size = 4 * scudo::getPageSizeCached();
39*76559068SAndroid Build Coastguard Worker EXPECT_DEATH(
40*76559068SAndroid Build Coastguard Worker {
41*76559068SAndroid Build Coastguard Worker // Repeat few time to avoid missing crash if it's mmaped by unrelated
42*76559068SAndroid Build Coastguard Worker // code.
43*76559068SAndroid Build Coastguard Worker for (int i = 0; i < 10; ++i) {
44*76559068SAndroid Build Coastguard Worker scudo::MemMapT MemMap;
45*76559068SAndroid Build Coastguard Worker MemMap.map(/*Addr=*/0U, Size, MappingName);
46*76559068SAndroid Build Coastguard Worker scudo::uptr P = MemMap.getBase();
47*76559068SAndroid Build Coastguard Worker if (P == 0U)
48*76559068SAndroid Build Coastguard Worker continue;
49*76559068SAndroid Build Coastguard Worker MemMap.unmap();
50*76559068SAndroid Build Coastguard Worker memset(reinterpret_cast<void *>(P), 0xbb, Size);
51*76559068SAndroid Build Coastguard Worker }
52*76559068SAndroid Build Coastguard Worker },
53*76559068SAndroid Build Coastguard Worker "");
54*76559068SAndroid Build Coastguard Worker }
55*76559068SAndroid Build Coastguard Worker
TEST(ScudoMapDeathTest,MapWithGuardUnmap)56*76559068SAndroid Build Coastguard Worker TEST(ScudoMapDeathTest, MapWithGuardUnmap) {
57*76559068SAndroid Build Coastguard Worker const scudo::uptr PageSize = scudo::getPageSizeCached();
58*76559068SAndroid Build Coastguard Worker const scudo::uptr Size = 4 * PageSize;
59*76559068SAndroid Build Coastguard Worker scudo::ReservedMemoryT ReservedMemory;
60*76559068SAndroid Build Coastguard Worker ASSERT_TRUE(
61*76559068SAndroid Build Coastguard Worker ReservedMemory.create(/*Addr=*/0U, Size + 2 * PageSize, MappingName));
62*76559068SAndroid Build Coastguard Worker ASSERT_NE(ReservedMemory.getBase(), 0U);
63*76559068SAndroid Build Coastguard Worker
64*76559068SAndroid Build Coastguard Worker scudo::MemMapT MemMap =
65*76559068SAndroid Build Coastguard Worker ReservedMemory.dispatch(ReservedMemory.getBase(), Size + 2 * PageSize);
66*76559068SAndroid Build Coastguard Worker ASSERT_TRUE(MemMap.isAllocated());
67*76559068SAndroid Build Coastguard Worker scudo::uptr Q = MemMap.getBase() + PageSize;
68*76559068SAndroid Build Coastguard Worker ASSERT_TRUE(MemMap.remap(Q, Size, MappingName));
69*76559068SAndroid Build Coastguard Worker memset(reinterpret_cast<void *>(Q), 0xaa, Size);
70*76559068SAndroid Build Coastguard Worker EXPECT_DEATH(memset(reinterpret_cast<void *>(Q), 0xaa, Size + 1), "");
71*76559068SAndroid Build Coastguard Worker MemMap.unmap();
72*76559068SAndroid Build Coastguard Worker }
73*76559068SAndroid Build Coastguard Worker
TEST(ScudoMapTest,MapGrowUnmap)74*76559068SAndroid Build Coastguard Worker TEST(ScudoMapTest, MapGrowUnmap) {
75*76559068SAndroid Build Coastguard Worker const scudo::uptr PageSize = scudo::getPageSizeCached();
76*76559068SAndroid Build Coastguard Worker const scudo::uptr Size = 4 * PageSize;
77*76559068SAndroid Build Coastguard Worker scudo::ReservedMemoryT ReservedMemory;
78*76559068SAndroid Build Coastguard Worker ReservedMemory.create(/*Addr=*/0U, Size, MappingName);
79*76559068SAndroid Build Coastguard Worker ASSERT_TRUE(ReservedMemory.isCreated());
80*76559068SAndroid Build Coastguard Worker
81*76559068SAndroid Build Coastguard Worker scudo::MemMapT MemMap =
82*76559068SAndroid Build Coastguard Worker ReservedMemory.dispatch(ReservedMemory.getBase(), Size);
83*76559068SAndroid Build Coastguard Worker ASSERT_TRUE(MemMap.isAllocated());
84*76559068SAndroid Build Coastguard Worker scudo::uptr Q = MemMap.getBase() + PageSize;
85*76559068SAndroid Build Coastguard Worker ASSERT_TRUE(MemMap.remap(Q, PageSize, MappingName));
86*76559068SAndroid Build Coastguard Worker memset(reinterpret_cast<void *>(Q), 0xaa, PageSize);
87*76559068SAndroid Build Coastguard Worker Q += PageSize;
88*76559068SAndroid Build Coastguard Worker ASSERT_TRUE(MemMap.remap(Q, PageSize, MappingName));
89*76559068SAndroid Build Coastguard Worker memset(reinterpret_cast<void *>(Q), 0xbb, PageSize);
90*76559068SAndroid Build Coastguard Worker MemMap.unmap();
91*76559068SAndroid Build Coastguard Worker }
92