1fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes/*
2fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes * Copyright (C) 2012 The Android Open Source Project
3fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes *
4fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License");
5fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes * you may not use this file except in compliance with the License.
6fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes * You may obtain a copy of the License at
7fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes *
8fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes *      http://www.apache.org/licenses/LICENSE-2.0
9fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes *
10fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes * Unless required by applicable law or agreed to in writing, software
11fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS,
12fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes * See the License for the specific language governing permissions and
14fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes * limitations under the License.
15fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes */
16fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes
17fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes// Deliberately overwrite the stack canary.
18fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes__attribute__((noinline)) void modify_stack_protector_test() {
19fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes  char buf[128];
20fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes  // We can't use memset here because it's fortified, and we want to test
21fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes  // the line of defense *after* that.
226057d184f548a5f17e2c9467228d167243d9736aElliott Hughes  // Without volatile, the generic x86/x86-64 targets don't write to the stack.
236057d184f548a5f17e2c9467228d167243d9736aElliott Hughes  volatile char* p = buf;
246057d184f548a5f17e2c9467228d167243d9736aElliott Hughes  int size = static_cast<int>(sizeof(buf) + 1);
256057d184f548a5f17e2c9467228d167243d9736aElliott Hughes  while ((p - buf) < size) *p++ = '\0';
26fc69a8ad5f0d9b63de48e3858fb4811ede7ac64eElliott Hughes}
27