| OLD | NEW |
| 1 // Copyright 2014 Google Inc. All Rights Reserved. | 1 // Copyright 2014 Google Inc. All Rights Reserved. |
| 2 // | 2 // |
| 3 // Licensed under the Apache License, Version 2.0 (the "License"); | 3 // Licensed under the Apache License, Version 2.0 (the "License"); |
| 4 // you may not use this file except in compliance with the License. | 4 // you may not use this file except in compliance with the License. |
| 5 // You may obtain a copy of the License at | 5 // You may obtain a copy of the License at |
| 6 // | 6 // |
| 7 // http://www.apache.org/licenses/LICENSE-2.0 | 7 // http://www.apache.org/licenses/LICENSE-2.0 |
| 8 // | 8 // |
| 9 // Unless required by applicable law or agreed to in writing, software | 9 // Unless required by applicable law or agreed to in writing, software |
| 10 // distributed under the License is distributed on an "AS IS" BASIS, | 10 // distributed under the License is distributed on an "AS IS" BASIS, |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 uint32_t min_right_redzone_size) { | 169 uint32_t min_right_redzone_size) { |
| 170 // Create and initialize the given block. | 170 // Create and initialize the given block. |
| 171 BlockLayout layout = {}; | 171 BlockLayout layout = {}; |
| 172 EXPECT_TRUE(BlockPlanLayout(chunk_size, alignment, size, | 172 EXPECT_TRUE(BlockPlanLayout(chunk_size, alignment, size, |
| 173 min_left_redzone_size, min_right_redzone_size, | 173 min_left_redzone_size, min_right_redzone_size, |
| 174 &layout)); | 174 &layout)); |
| 175 void* alloc = | 175 void* alloc = |
| 176 ::VirtualAlloc(NULL, layout.block_size, MEM_COMMIT, PAGE_READWRITE); | 176 ::VirtualAlloc(NULL, layout.block_size, MEM_COMMIT, PAGE_READWRITE); |
| 177 ASSERT_TRUE(alloc != NULL); | 177 ASSERT_TRUE(alloc != NULL); |
| 178 BlockInfo block_info = {}; | 178 BlockInfo block_info = {}; |
| 179 BlockInitialize(layout, alloc, false, &block_info); | 179 BlockInitialize(layout, alloc, &block_info); |
| 180 | 180 |
| 181 // By default the protections should be disabled for a fresh allocation. | 181 // By default the protections should be disabled for a fresh allocation. |
| 182 EXPECT_NO_FATAL_FAILURE( | 182 EXPECT_NO_FATAL_FAILURE( |
| 183 TestAccessUnderProtection(block_info, kProtectNone)); | 183 TestAccessUnderProtection(block_info, kProtectNone)); |
| 184 | 184 |
| 185 // Try a full cycle of page protections. This tests all possible | 185 // Try a full cycle of page protections. This tests all possible |
| 186 // transitions, including self transitions. | 186 // transitions, including self transitions. |
| 187 EXPECT_NO_FATAL_FAILURE(TestProtectNone(block_info)); | 187 EXPECT_NO_FATAL_FAILURE(TestProtectNone(block_info)); |
| 188 EXPECT_NO_FATAL_FAILURE(TestProtectNone(block_info)); | 188 EXPECT_NO_FATAL_FAILURE(TestProtectNone(block_info)); |
| 189 EXPECT_NO_FATAL_FAILURE(TestProtectRedzones(block_info)); | 189 EXPECT_NO_FATAL_FAILURE(TestProtectRedzones(block_info)); |
| (...skipping 20 matching lines...) Expand all Loading... |
| 210 BlockLayout layout = {}; | 210 BlockLayout layout = {}; |
| 211 BlockPlanLayout(4096, 4096, 4096, 4096, 4096, &layout); | 211 BlockPlanLayout(4096, 4096, 4096, 4096, 4096, &layout); |
| 212 | 212 |
| 213 void* alloc = ::VirtualAlloc( | 213 void* alloc = ::VirtualAlloc( |
| 214 nullptr, layout.block_size, MEM_COMMIT, PAGE_READWRITE); | 214 nullptr, layout.block_size, MEM_COMMIT, PAGE_READWRITE); |
| 215 ASSERT_TRUE(alloc != nullptr); | 215 ASSERT_TRUE(alloc != nullptr); |
| 216 ::memset(alloc, 0, layout.block_size); | 216 ::memset(alloc, 0, layout.block_size); |
| 217 | 217 |
| 218 // Initialize the block in both memory and the shadow memory. | 218 // Initialize the block in both memory and the shadow memory. |
| 219 BlockInfo info = {}; | 219 BlockInfo info = {}; |
| 220 BlockInitialize(layout, alloc, false, &info); | 220 BlockInitialize(layout, alloc, &info); |
| 221 shadow_.PoisonAllocatedBlock(info); | 221 shadow_.PoisonAllocatedBlock(info); |
| 222 | 222 |
| 223 // Try recovering in the usual case. | 223 // Try recovering in the usual case. |
| 224 BlockInfo info_recovered = {}; | 224 BlockInfo info_recovered = {}; |
| 225 EXPECT_TRUE(BlockInfoFromMemory(info.header, &info_recovered)); | 225 EXPECT_TRUE(BlockInfoFromMemory(info.header, &info_recovered)); |
| 226 EXPECT_TRUE(GetBlockInfo(&shadow_, info.body, &info_recovered)); | 226 EXPECT_TRUE(GetBlockInfo(&shadow_, info.body, &info_recovered)); |
| 227 EXPECT_EQ(0, ::memcmp(&info, &info_recovered, sizeof(info))); | 227 EXPECT_EQ(0, ::memcmp(&info, &info_recovered, sizeof(info))); |
| 228 | 228 |
| 229 // Muck up the header and try again. | 229 // Muck up the header and try again. |
| 230 info.header->magic++; | 230 info.header->magic++; |
| (...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 272 TEST_F(PageProtectionHelpersTest, BlockProtectAuto) { | 272 TEST_F(PageProtectionHelpersTest, BlockProtectAuto) { |
| 273 BlockLayout layout = {}; | 273 BlockLayout layout = {}; |
| 274 const uint32_t kPageSize = static_cast<uint32_t>(GetPageSize()); | 274 const uint32_t kPageSize = static_cast<uint32_t>(GetPageSize()); |
| 275 EXPECT_TRUE(BlockPlanLayout(kPageSize, kPageSize, kPageSize, kPageSize, | 275 EXPECT_TRUE(BlockPlanLayout(kPageSize, kPageSize, kPageSize, kPageSize, |
| 276 kPageSize, &layout)); | 276 kPageSize, &layout)); |
| 277 void* alloc = ::VirtualAlloc(NULL, layout.block_size, MEM_COMMIT, | 277 void* alloc = ::VirtualAlloc(NULL, layout.block_size, MEM_COMMIT, |
| 278 PAGE_READWRITE); | 278 PAGE_READWRITE); |
| 279 ASSERT_TRUE(alloc != NULL); | 279 ASSERT_TRUE(alloc != NULL); |
| 280 | 280 |
| 281 BlockInfo block_info = {}; | 281 BlockInfo block_info = {}; |
| 282 BlockInitialize(layout, alloc, false, &block_info); | 282 BlockInitialize(layout, alloc, &block_info); |
| 283 TestAccessUnderProtection(block_info, kProtectNone); | 283 TestAccessUnderProtection(block_info, kProtectNone); |
| 284 | 284 |
| 285 block_info.header->state = ALLOCATED_BLOCK; | 285 block_info.header->state = ALLOCATED_BLOCK; |
| 286 BlockProtectAuto(block_info, &shadow_); | 286 BlockProtectAuto(block_info, &shadow_); |
| 287 TestAccessUnderProtection(block_info, kProtectRedzones); | 287 TestAccessUnderProtection(block_info, kProtectRedzones); |
| 288 BlockProtectNone(block_info, &shadow_); | 288 BlockProtectNone(block_info, &shadow_); |
| 289 | 289 |
| 290 block_info.header->state = QUARANTINED_BLOCK; | 290 block_info.header->state = QUARANTINED_BLOCK; |
| 291 BlockProtectAuto(block_info, &shadow_); | 291 BlockProtectAuto(block_info, &shadow_); |
| 292 TestAccessUnderProtection(block_info, kProtectAll); | 292 TestAccessUnderProtection(block_info, kProtectAll); |
| 293 BlockProtectNone(block_info, &shadow_); | 293 BlockProtectNone(block_info, &shadow_); |
| 294 | 294 |
| 295 block_info.header->state = QUARANTINED_FLOODED_BLOCK; | 295 block_info.header->state = QUARANTINED_FLOODED_BLOCK; |
| 296 BlockProtectAuto(block_info, &shadow_); | 296 BlockProtectAuto(block_info, &shadow_); |
| 297 TestAccessUnderProtection(block_info, kProtectAll); | 297 TestAccessUnderProtection(block_info, kProtectAll); |
| 298 BlockProtectNone(block_info, &shadow_); | 298 BlockProtectNone(block_info, &shadow_); |
| 299 | 299 |
| 300 block_info.header->state = FREED_BLOCK; | 300 block_info.header->state = FREED_BLOCK; |
| 301 BlockProtectAuto(block_info, &shadow_); | 301 BlockProtectAuto(block_info, &shadow_); |
| 302 TestAccessUnderProtection(block_info, kProtectAll); | 302 TestAccessUnderProtection(block_info, kProtectAll); |
| 303 BlockProtectNone(block_info, &shadow_); | 303 BlockProtectNone(block_info, &shadow_); |
| 304 | 304 |
| 305 ASSERT_EQ(TRUE, ::VirtualFree(alloc, 0, MEM_RELEASE)); | 305 ASSERT_EQ(TRUE, ::VirtualFree(alloc, 0, MEM_RELEASE)); |
| 306 } | 306 } |
| 307 | 307 |
| 308 } // namespace asan | 308 } // namespace asan |
| 309 } // namespace agent | 309 } // namespace agent |
| OLD | NEW |