xref: /aosp_15_r20/external/cronet/base/stack_canary_linux_unittest.cc (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
1*6777b538SAndroid Build Coastguard Worker // Copyright 2021 The Chromium Authors
2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be
3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file.
4*6777b538SAndroid Build Coastguard Worker 
5*6777b538SAndroid Build Coastguard Worker #include "base/stack_canary_linux.h"
6*6777b538SAndroid Build Coastguard Worker 
7*6777b538SAndroid Build Coastguard Worker #include "base/compiler_specific.h"
8*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h"
9*6777b538SAndroid Build Coastguard Worker #include "testing/gtest/include/gtest/gtest.h"
10*6777b538SAndroid Build Coastguard Worker 
11*6777b538SAndroid Build Coastguard Worker namespace base {
12*6777b538SAndroid Build Coastguard Worker 
13*6777b538SAndroid Build Coastguard Worker #if defined(LIBC_GLIBC) && \
14*6777b538SAndroid Build Coastguard Worker     (defined(ARCH_CPU_ARM_FAMILY) || defined(ARCH_CPU_X86_FAMILY))
15*6777b538SAndroid Build Coastguard Worker 
16*6777b538SAndroid Build Coastguard Worker namespace {
ResetCanaryAndReturn()17*6777b538SAndroid Build Coastguard Worker NOINLINE NOOPT void ResetCanaryAndReturn() {
18*6777b538SAndroid Build Coastguard Worker   // Create a buffer >=8 bytes to force the stack protector on this function,
19*6777b538SAndroid Build Coastguard Worker   // which should work as long as -fno-stack-protector isn't passed in the
20*6777b538SAndroid Build Coastguard Worker   // default options. We compile this file with -fstack-protector-all, but it
21*6777b538SAndroid Build Coastguard Worker   // may be overridden with -fstack-protector or -fstack-protector-strong.
22*6777b538SAndroid Build Coastguard Worker   [[maybe_unused]] char buffer[10];
23*6777b538SAndroid Build Coastguard Worker   ResetStackCanaryIfPossible();
24*6777b538SAndroid Build Coastguard Worker }
25*6777b538SAndroid Build Coastguard Worker }  // namespace
26*6777b538SAndroid Build Coastguard Worker 
27*6777b538SAndroid Build Coastguard Worker // Essentially tests that ResetStackCanaryIfPossible() changes the
28*6777b538SAndroid Build Coastguard Worker // actual reference canary that is checked in the function prologue.
TEST(StackCanary,ChangingStackCanaryCrashesOnReturn)29*6777b538SAndroid Build Coastguard Worker TEST(StackCanary, ChangingStackCanaryCrashesOnReturn) {
30*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH(ResetCanaryAndReturn(), "stack smashing");
31*6777b538SAndroid Build Coastguard Worker }
32*6777b538SAndroid Build Coastguard Worker 
33*6777b538SAndroid Build Coastguard Worker #if !defined(NDEBUG)
34*6777b538SAndroid Build Coastguard Worker // Tests that the useful debug message works--specifically that on death, it
35*6777b538SAndroid Build Coastguard Worker // prints out the bug URL with useful information.
TEST(StackCanary,ChangingStackCanaryPrintsDebugMessage)36*6777b538SAndroid Build Coastguard Worker TEST(StackCanary, ChangingStackCanaryPrintsDebugMessage) {
37*6777b538SAndroid Build Coastguard Worker   SetStackSmashingEmitsDebugMessage();
38*6777b538SAndroid Build Coastguard Worker   ASSERT_DEATH(ResetCanaryAndReturn(), "crbug\\.com/1206626");
39*6777b538SAndroid Build Coastguard Worker }
40*6777b538SAndroid Build Coastguard Worker #endif  // !defined(NDEBUG)
41*6777b538SAndroid Build Coastguard Worker 
42*6777b538SAndroid Build Coastguard Worker #endif  // defined(LIBC_GLIBC) && (defined(ARCH_CPU_ARM_FAMILY) ||
43*6777b538SAndroid Build Coastguard Worker         // defined(ARCH_CPU_X86_FAMILY))
44*6777b538SAndroid Build Coastguard Worker 
45*6777b538SAndroid Build Coastguard Worker }  // namespace base
46