| // Copyright 2021 The Chromium Authors |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "base/stack_canary_linux.h" |
| |
| #include "base/compiler_specific.h" |
| #include "build/build_config.h" |
| #include "testing/gtest/include/gtest/gtest.h" |
| |
| namespace base { |
| |
| #if defined(LIBC_GLIBC) && \ |
| (defined(ARCH_CPU_ARM_FAMILY) || defined(ARCH_CPU_X86_FAMILY)) |
| |
| namespace { |
| NOINLINE NOOPT void ResetCanaryAndReturn() { |
| // Create a buffer >=8 bytes to force the stack protector on this function, |
| // which should work as long as -fno-stack-protector isn't passed in the |
| // default options. We compile this file with -fstack-protector-all, but it |
| // may be overridden with -fstack-protector or -fstack-protector-strong. |
| [[maybe_unused]] char buffer[10]; |
| ResetStackCanaryIfPossible(); |
| } |
| } // namespace |
| |
| // Essentially tests that ResetStackCanaryIfPossible() changes the |
| // actual reference canary that is checked in the function prologue. |
| TEST(StackCanary, ChangingStackCanaryCrashesOnReturn) { |
| ASSERT_DEATH(ResetCanaryAndReturn(), "stack smashing"); |
| } |
| |
| #if !defined(NDEBUG) |
| // Tests that the useful debug message works--specifically that on death, it |
| // prints out the bug URL with useful information. |
| TEST(StackCanary, ChangingStackCanaryPrintsDebugMessage) { |
| SetStackSmashingEmitsDebugMessage(); |
| ASSERT_DEATH(ResetCanaryAndReturn(), "crbug\\.com/1206626"); |
| } |
| #endif // !defined(NDEBUG) |
| |
| #endif // defined(LIBC_GLIBC) && (defined(ARCH_CPU_ARM_FAMILY) || |
| // defined(ARCH_CPU_X86_FAMILY)) |
| |
| } // namespace base |