summaryrefslogtreecommitdiff
path: root/tests/stack_protector_test.cpp
diff options
context:
space:
mode:
authorNick Kralevich <nnk@google.com>2013-01-10 17:12:29 -0800
committerNick Kralevich <nnk@google.com>2013-01-11 10:52:36 -0800
commitdcab1b2c76a498c56bc00024613386de8b4b2aae (patch)
tree6d7eb1ea166186df3092552b190b4485658b3e68 /tests/stack_protector_test.cpp
parentbfde0b6fd9e5de545746ab963d3a05ed2a8014f6 (diff)
Add stack canaries / strcpy tests.
Add a test to ensure that stack canaries are working correctly. Since stack canaries aren't normally generated on non-string functions, we have to enable stack-protector-all. Add a test to ensure that an out of bounds strcpy generates a runtime failure. Change-Id: Id0d3e59fc4b9602da019e4d35c5c653e1a57fae4
Diffstat (limited to 'tests/stack_protector_test.cpp')
-rw-r--r--tests/stack_protector_test.cpp20
1 files changed, 20 insertions, 0 deletions
diff --git a/tests/stack_protector_test.cpp b/tests/stack_protector_test.cpp
index 9d86506ac..9cf3c38ab 100644
--- a/tests/stack_protector_test.cpp
+++ b/tests/stack_protector_test.cpp
@@ -114,4 +114,24 @@ TEST(stack_protector, global_guard) {
ASSERT_NE(0U, reinterpret_cast<uintptr_t>(__stack_chk_guard));
}
+/*
+ * When this function returns, the stack canary will be inconsistent
+ * with the previous value, which will generate a call to __stack_chk_fail(),
+ * eventually resulting in a SIGABRT.
+ *
+ * This must be marked with "__attribute__ ((noinline))", to ensure the
+ * compiler generates the proper stack guards around this function.
+ */
+__attribute__ ((noinline))
+static void do_modify_stack_chk_guard() {
+ __stack_chk_guard = (void *) 0x12345678;
+}
+
+// We have to say "DeathTest" here so gtest knows to run this test (which exits)
+// in its own process.
+TEST(stack_protector_DeathTest, modify_stack_protector) {
+ ::testing::FLAGS_gtest_death_test_style = "threadsafe";
+ ASSERT_EXIT(do_modify_stack_chk_guard(), testing::KilledBySignal(SIGABRT), "");
+}
+
#endif