| OLD | NEW |
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "gtest/gtest.h" | 5 #include "gtest/gtest.h" |
| 6 #include "chrome_frame/exception_barrier.h" | 6 #include "chrome_frame/exception_barrier.h" |
| 7 | 7 |
| 8 namespace { | 8 namespace { |
| 9 | 9 |
| 10 // retrieves the top SEH registration record | 10 // retrieves the top SEH registration record |
| (...skipping 11 matching lines...) Expand all Loading... |
| 22 // # Is the registration DWORD aligned | 22 // # Is the registration DWORD aligned |
| 23 // # Does each exception handler point to a module, as opposed to | 23 // # Does each exception handler point to a module, as opposed to |
| 24 // e.g. into the stack or never-never land. | 24 // e.g. into the stack or never-never land. |
| 25 // # Do successive entries in the exception chain increase | 25 // # Do successive entries in the exception chain increase |
| 26 // monotonically in address | 26 // monotonically in address |
| 27 void TestSEHChainSane() { | 27 void TestSEHChainSane() { |
| 28 // get the skinny on our stack segment | 28 // get the skinny on our stack segment |
| 29 MEMORY_BASIC_INFORMATION info = { 0 }; | 29 MEMORY_BASIC_INFORMATION info = { 0 }; |
| 30 // Note that we pass the address of the info struct just as a handy | 30 // Note that we pass the address of the info struct just as a handy |
| 31 // moniker to anything at all inside our stack allocation | 31 // moniker to anything at all inside our stack allocation |
| 32 ASSERT_NE(0, ::VirtualQuery(&info, &info, sizeof(info))); | 32 ASSERT_NE(0u, ::VirtualQuery(&info, &info, sizeof(info))); |
| 33 | 33 |
| 34 // The lower bound of our stack. | 34 // The lower bound of our stack. |
| 35 // We use the address of info as a lower bound, this assumes that if this | 35 // We use the address of info as a lower bound, this assumes that if this |
| 36 // function has an SEH handler, it'll be higher up in our invocation | 36 // function has an SEH handler, it'll be higher up in our invocation |
| 37 // record. | 37 // record. |
| 38 EXCEPTION_REGISTRATION* limit = | 38 EXCEPTION_REGISTRATION* limit = |
| 39 reinterpret_cast<EXCEPTION_REGISTRATION*>(&info); | 39 reinterpret_cast<EXCEPTION_REGISTRATION*>(&info); |
| 40 // the very top of our stack segment | 40 // the very top of our stack segment |
| 41 EXCEPTION_REGISTRATION* top = | 41 EXCEPTION_REGISTRATION* top = |
| 42 reinterpret_cast<EXCEPTION_REGISTRATION*>( | 42 reinterpret_cast<EXCEPTION_REGISTRATION*>( |
| (...skipping 10 matching lines...) Expand all Loading... |
| 53 // registrations must increase monotonically | 53 // registrations must increase monotonically |
| 54 ASSERT_TRUE(curr > prev); | 54 ASSERT_TRUE(curr > prev); |
| 55 // Check it's in bounds | 55 // Check it's in bounds |
| 56 ASSERT_GE(top, curr); | 56 ASSERT_GE(top, curr); |
| 57 ASSERT_LT(limit, curr); | 57 ASSERT_LT(limit, curr); |
| 58 | 58 |
| 59 // check for DWORD alignment | 59 // check for DWORD alignment |
| 60 ASSERT_EQ(0, (reinterpret_cast<UINT_PTR>(prev) & 0x00000003)); | 60 ASSERT_EQ(0, (reinterpret_cast<UINT_PTR>(prev) & 0x00000003)); |
| 61 | 61 |
| 62 // find the module hosting the handler | 62 // find the module hosting the handler |
| 63 ASSERT_NE(0, ::VirtualQuery(curr->handler, &info, sizeof(info))); | 63 ASSERT_NE(0u, ::VirtualQuery(curr->handler, &info, sizeof(info))); |
| 64 wchar_t module_filename[MAX_PATH]; | 64 wchar_t module_filename[MAX_PATH]; |
| 65 ASSERT_NE(0, ::GetModuleFileName( | 65 ASSERT_NE(0u, ::GetModuleFileName( |
| 66 reinterpret_cast<HMODULE>(info.AllocationBase), | 66 reinterpret_cast<HMODULE>(info.AllocationBase), |
| 67 module_filename, ARRAYSIZE(module_filename))); | 67 module_filename, ARRAYSIZE(module_filename))); |
| 68 } | 68 } |
| 69 } | 69 } |
| 70 | 70 |
| 71 void AccessViolationCrash() { | 71 void AccessViolationCrash() { |
| 72 volatile char* null = NULL; | 72 volatile char* null = NULL; |
| 73 *null = '\0'; | 73 *null = '\0'; |
| 74 } | 74 } |
| 75 | 75 |
| (...skipping 273 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 349 return TestRegularChaining(top) && TestExceptionBarrierChaining(top); | 349 return TestRegularChaining(top) && TestExceptionBarrierChaining(top); |
| 350 } | 350 } |
| 351 | 351 |
| 352 // Test that the SEH chain is unmolested by exception barrier, both under | 352 // Test that the SEH chain is unmolested by exception barrier, both under |
| 353 // regular unroll, and under exception unroll. | 353 // regular unroll, and under exception unroll. |
| 354 TEST_F(ExceptionBarrierTest, SEHChainIsSaneAfterException) { | 354 TEST_F(ExceptionBarrierTest, SEHChainIsSaneAfterException) { |
| 355 EXPECT_TRUE(TestChaining()); | 355 EXPECT_TRUE(TestChaining()); |
| 356 } | 356 } |
| 357 | 357 |
| 358 } // namespace | 358 } // namespace |
| OLD | NEW |