1 //===-- map_test.cpp --------------------------------------------*- C++ -*-===//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 
9 #include "common.h"
10 
11 #include "gtest/gtest.h"
12 
13 #include <string.h>
14 #include <unistd.h>
15 
16 static const char *MappingName = "scudo:test";
17 
18 TEST(ScudoMapTest, PageSize) {
19   EXPECT_EQ(scudo::getPageSizeCached(),
20             static_cast<scudo::uptr>(getpagesize()));
21 }
22 
23 TEST(ScudoMapTest, MapNoAccessUnmap) {
24   const scudo::uptr Size = 4 * scudo::getPageSizeCached();
25   scudo::MapPlatformData Data = {};
26   void *P = scudo::map(nullptr, Size, MappingName, MAP_NOACCESS, &Data);
27   EXPECT_NE(P, nullptr);
28   EXPECT_DEATH(memset(P, 0xaa, Size), "");
29   scudo::unmap(P, Size, UNMAP_ALL, &Data);
30 }
31 
32 TEST(ScudoMapTest, MapUnmap) {
33   const scudo::uptr Size = 4 * scudo::getPageSizeCached();
34   scudo::MapPlatformData Data = {};
35   void *P = scudo::map(nullptr, Size, MappingName, 0, &Data);
36   EXPECT_NE(P, nullptr);
37   memset(P, 0xaa, Size);
38   scudo::unmap(P, Size, 0, &Data);
39   EXPECT_DEATH(memset(P, 0xbb, Size), "");
40 }
41 
42 TEST(ScudoMapTest, MapWithGuardUnmap) {
43   const scudo::uptr PageSize = scudo::getPageSizeCached();
44   const scudo::uptr Size = 4 * PageSize;
45   scudo::MapPlatformData Data = {};
46   void *P = scudo::map(nullptr, Size + 2 * PageSize, MappingName, MAP_NOACCESS,
47                        &Data);
48   EXPECT_NE(P, nullptr);
49   void *Q =
50       reinterpret_cast<void *>(reinterpret_cast<scudo::uptr>(P) + PageSize);
51   EXPECT_EQ(scudo::map(Q, Size, MappingName, 0, &Data), Q);
52   memset(Q, 0xaa, Size);
53   EXPECT_DEATH(memset(Q, 0xaa, Size + 1), "");
54   scudo::unmap(P, Size + 2 * PageSize, UNMAP_ALL, &Data);
55 }
56 
57 TEST(ScudoMapTest, MapGrowUnmap) {
58   const scudo::uptr PageSize = scudo::getPageSizeCached();
59   const scudo::uptr Size = 4 * PageSize;
60   scudo::MapPlatformData Data = {};
61   void *P = scudo::map(nullptr, Size, MappingName, MAP_NOACCESS, &Data);
62   EXPECT_NE(P, nullptr);
63   void *Q =
64       reinterpret_cast<void *>(reinterpret_cast<scudo::uptr>(P) + PageSize);
65   EXPECT_EQ(scudo::map(Q, PageSize, MappingName, 0, &Data), Q);
66   memset(Q, 0xaa, PageSize);
67   Q = reinterpret_cast<void *>(reinterpret_cast<scudo::uptr>(Q) + PageSize);
68   EXPECT_EQ(scudo::map(Q, PageSize, MappingName, 0, &Data), Q);
69   memset(Q, 0xbb, PageSize);
70   scudo::unmap(P, Size, UNMAP_ALL, &Data);
71 }
72