|
14 | 14 | #include <string.h> |
15 | 15 | #include <unistd.h> |
16 | 16 |
|
| 17 | +#if SCUDO_LINUX |
| 18 | +#include <sys/mman.h> |
| 19 | +#endif |
| 20 | + |
17 | 21 | static const char *MappingName = "scudo:test"; |
18 | 22 |
|
19 | 23 | TEST(ScudoMapTest, PageSize) { |
@@ -89,3 +93,45 @@ TEST(ScudoMapTest, MapGrowUnmap) { |
89 | 93 | memset(reinterpret_cast<void *>(Q), 0xbb, PageSize); |
90 | 94 | MemMap.unmap(); |
91 | 95 | } |
| 96 | + |
| 97 | +// Verify that zeroing works properly. |
| 98 | +TEST(ScudoMapTest, Zeroing) { |
| 99 | + scudo::ReservedMemoryT ReservedMemory; |
| 100 | + const scudo::uptr PageSize = scudo::getPageSizeCached(); |
| 101 | + const scudo::uptr Size = 3 * PageSize; |
| 102 | + ReservedMemory.create(/*Addr=*/0U, Size, MappingName); |
| 103 | + ASSERT_TRUE(ReservedMemory.isCreated()); |
| 104 | + |
| 105 | + scudo::MemMapT MemMap = ReservedMemory.dispatch(ReservedMemory.getBase(), |
| 106 | + ReservedMemory.getCapacity()); |
| 107 | + EXPECT_TRUE( |
| 108 | + MemMap.remap(MemMap.getBase(), MemMap.getCapacity(), MappingName)); |
| 109 | + unsigned char *Data = reinterpret_cast<unsigned char *>(MemMap.getBase()); |
| 110 | + memset(Data, 1U, MemMap.getCapacity()); |
| 111 | + // Spot check some values. |
| 112 | + EXPECT_EQ(1U, Data[0]); |
| 113 | + EXPECT_EQ(1U, Data[PageSize]); |
| 114 | + EXPECT_EQ(1U, Data[PageSize * 2]); |
| 115 | + MemMap.releaseAndZeroPagesToOS(MemMap.getBase(), MemMap.getCapacity()); |
| 116 | + EXPECT_EQ(0U, Data[0]); |
| 117 | + EXPECT_EQ(0U, Data[PageSize]); |
| 118 | + EXPECT_EQ(0U, Data[PageSize * 2]); |
| 119 | + |
| 120 | +#if SCUDO_LINUX |
| 121 | + // Now verify that if madvise fails, the data is still zeroed. |
| 122 | + memset(Data, 1U, MemMap.getCapacity()); |
| 123 | + EXPECT_NE(-1, mlock(Data, MemMap.getCapacity())); |
| 124 | + |
| 125 | + EXPECT_EQ(1U, Data[0]); |
| 126 | + EXPECT_EQ(1U, Data[PageSize]); |
| 127 | + EXPECT_EQ(1U, Data[PageSize * 2]); |
| 128 | + MemMap.releaseAndZeroPagesToOS(MemMap.getBase(), MemMap.getCapacity()); |
| 129 | + EXPECT_EQ(0U, Data[0]); |
| 130 | + EXPECT_EQ(0U, Data[PageSize]); |
| 131 | + EXPECT_EQ(0U, Data[PageSize * 2]); |
| 132 | + |
| 133 | + EXPECT_NE(-1, munlock(Data, MemMap.getCapacity())); |
| 134 | +#endif |
| 135 | + |
| 136 | + MemMap.unmap(); |
| 137 | +} |
0 commit comments