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 WorkerNOINLINE 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 WorkerTEST(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 WorkerTEST(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