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 "tests/scudo_unit_test.h" 10 11 #include "common.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 void *P = scudo::map(nullptr, Size, MappingName, 0, nullptr); 35 EXPECT_NE(P, nullptr); 36 memset(P, 0xaa, Size); 37 scudo::unmap(P, Size, 0, nullptr); 38 EXPECT_DEATH(memset(P, 0xbb, Size), ""); 39 } 40 41 TEST(ScudoMapTest, MapWithGuardUnmap) { 42 const scudo::uptr PageSize = scudo::getPageSizeCached(); 43 const scudo::uptr Size = 4 * PageSize; 44 scudo::MapPlatformData Data = {}; 45 void *P = scudo::map(nullptr, Size + 2 * PageSize, MappingName, MAP_NOACCESS, 46 &Data); 47 EXPECT_NE(P, nullptr); 48 void *Q = 49 reinterpret_cast<void *>(reinterpret_cast<scudo::uptr>(P) + PageSize); 50 EXPECT_EQ(scudo::map(Q, Size, MappingName, 0, &Data), Q); 51 memset(Q, 0xaa, Size); 52 EXPECT_DEATH(memset(Q, 0xaa, Size + 1), ""); 53 scudo::unmap(P, Size + 2 * PageSize, UNMAP_ALL, &Data); 54 } 55 56 TEST(ScudoMapTest, MapGrowUnmap) { 57 const scudo::uptr PageSize = scudo::getPageSizeCached(); 58 const scudo::uptr Size = 4 * PageSize; 59 scudo::MapPlatformData Data = {}; 60 void *P = scudo::map(nullptr, Size, MappingName, MAP_NOACCESS, &Data); 61 EXPECT_NE(P, nullptr); 62 void *Q = 63 reinterpret_cast<void *>(reinterpret_cast<scudo::uptr>(P) + PageSize); 64 EXPECT_EQ(scudo::map(Q, PageSize, MappingName, 0, &Data), Q); 65 memset(Q, 0xaa, PageSize); 66 Q = reinterpret_cast<void *>(reinterpret_cast<scudo::uptr>(Q) + PageSize); 67 EXPECT_EQ(scudo::map(Q, PageSize, MappingName, 0, &Data), Q); 68 memset(Q, 0xbb, PageSize); 69 scudo::unmap(P, Size, UNMAP_ALL, &Data); 70 } 71