13cab2bb3Spatrick //===-- map_test.cpp --------------------------------------------*- C++ -*-===//
23cab2bb3Spatrick //
33cab2bb3Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
43cab2bb3Spatrick // See https://llvm.org/LICENSE.txt for license information.
53cab2bb3Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
63cab2bb3Spatrick //
73cab2bb3Spatrick //===----------------------------------------------------------------------===//
83cab2bb3Spatrick
93cab2bb3Spatrick #include "tests/scudo_unit_test.h"
103cab2bb3Spatrick
113cab2bb3Spatrick #include "common.h"
123cab2bb3Spatrick
133cab2bb3Spatrick #include <string.h>
143cab2bb3Spatrick #include <unistd.h>
153cab2bb3Spatrick
163cab2bb3Spatrick static const char *MappingName = "scudo:test";
173cab2bb3Spatrick
TEST(ScudoMapTest,PageSize)183cab2bb3Spatrick TEST(ScudoMapTest, PageSize) {
193cab2bb3Spatrick EXPECT_EQ(scudo::getPageSizeCached(),
20*810390e3Srobert static_cast<scudo::uptr>(sysconf(_SC_PAGESIZE)));
213cab2bb3Spatrick }
223cab2bb3Spatrick
TEST(ScudoMapDeathTest,MapNoAccessUnmap)23d89ec533Spatrick TEST(ScudoMapDeathTest, MapNoAccessUnmap) {
243cab2bb3Spatrick const scudo::uptr Size = 4 * scudo::getPageSizeCached();
253cab2bb3Spatrick scudo::MapPlatformData Data = {};
263cab2bb3Spatrick void *P = scudo::map(nullptr, Size, MappingName, MAP_NOACCESS, &Data);
273cab2bb3Spatrick EXPECT_NE(P, nullptr);
283cab2bb3Spatrick EXPECT_DEATH(memset(P, 0xaa, Size), "");
293cab2bb3Spatrick scudo::unmap(P, Size, UNMAP_ALL, &Data);
303cab2bb3Spatrick }
313cab2bb3Spatrick
TEST(ScudoMapDeathTest,MapUnmap)32d89ec533Spatrick TEST(ScudoMapDeathTest, MapUnmap) {
333cab2bb3Spatrick const scudo::uptr Size = 4 * scudo::getPageSizeCached();
34d89ec533Spatrick EXPECT_DEATH(
35d89ec533Spatrick {
36d89ec533Spatrick // Repeat few time to avoid missing crash if it's mmaped by unrelated
37d89ec533Spatrick // code.
38d89ec533Spatrick for (int i = 0; i < 10; ++i) {
393cab2bb3Spatrick void *P = scudo::map(nullptr, Size, MappingName, 0, nullptr);
40d89ec533Spatrick if (!P)
41d89ec533Spatrick continue;
423cab2bb3Spatrick scudo::unmap(P, Size, 0, nullptr);
43d89ec533Spatrick memset(P, 0xbb, Size);
44d89ec533Spatrick }
45d89ec533Spatrick },
46d89ec533Spatrick "");
473cab2bb3Spatrick }
483cab2bb3Spatrick
TEST(ScudoMapDeathTest,MapWithGuardUnmap)49d89ec533Spatrick TEST(ScudoMapDeathTest, MapWithGuardUnmap) {
503cab2bb3Spatrick const scudo::uptr PageSize = scudo::getPageSizeCached();
513cab2bb3Spatrick const scudo::uptr Size = 4 * PageSize;
523cab2bb3Spatrick scudo::MapPlatformData Data = {};
533cab2bb3Spatrick void *P = scudo::map(nullptr, Size + 2 * PageSize, MappingName, MAP_NOACCESS,
543cab2bb3Spatrick &Data);
553cab2bb3Spatrick EXPECT_NE(P, nullptr);
563cab2bb3Spatrick void *Q =
573cab2bb3Spatrick reinterpret_cast<void *>(reinterpret_cast<scudo::uptr>(P) + PageSize);
583cab2bb3Spatrick EXPECT_EQ(scudo::map(Q, Size, MappingName, 0, &Data), Q);
593cab2bb3Spatrick memset(Q, 0xaa, Size);
603cab2bb3Spatrick EXPECT_DEATH(memset(Q, 0xaa, Size + 1), "");
613cab2bb3Spatrick scudo::unmap(P, Size + 2 * PageSize, UNMAP_ALL, &Data);
623cab2bb3Spatrick }
633cab2bb3Spatrick
TEST(ScudoMapTest,MapGrowUnmap)643cab2bb3Spatrick TEST(ScudoMapTest, MapGrowUnmap) {
653cab2bb3Spatrick const scudo::uptr PageSize = scudo::getPageSizeCached();
663cab2bb3Spatrick const scudo::uptr Size = 4 * PageSize;
673cab2bb3Spatrick scudo::MapPlatformData Data = {};
683cab2bb3Spatrick void *P = scudo::map(nullptr, Size, MappingName, MAP_NOACCESS, &Data);
693cab2bb3Spatrick EXPECT_NE(P, nullptr);
703cab2bb3Spatrick void *Q =
713cab2bb3Spatrick reinterpret_cast<void *>(reinterpret_cast<scudo::uptr>(P) + PageSize);
723cab2bb3Spatrick EXPECT_EQ(scudo::map(Q, PageSize, MappingName, 0, &Data), Q);
733cab2bb3Spatrick memset(Q, 0xaa, PageSize);
743cab2bb3Spatrick Q = reinterpret_cast<void *>(reinterpret_cast<scudo::uptr>(Q) + PageSize);
753cab2bb3Spatrick EXPECT_EQ(scudo::map(Q, PageSize, MappingName, 0, &Data), Q);
763cab2bb3Spatrick memset(Q, 0xbb, PageSize);
773cab2bb3Spatrick scudo::unmap(P, Size, UNMAP_ALL, &Data);
783cab2bb3Spatrick }
79