brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.8 KiB · 3508b16 Raw
68 lines · cpp
1//===--- Stack smashing test to check stack canary set up  ----------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "src/__support/CPP/string.h"10#include "src/__support/OSUtil/io.h"11#include "src/pthread/pthread_atfork.h"12#include "src/signal/raise.h"13#include "src/sys/wait/wait.h"14#include "src/sys/wait/wait4.h"15#include "src/sys/wait/waitpid.h"16#include "src/unistd/fork.h"17 18#include "test/IntegrationTest/test.h"19 20#include <signal.h>21#include <sys/wait.h>22#include <unistd.h>23 24void no_stack_smashing_normal_exit() {25  pid_t pid = LIBC_NAMESPACE::fork();26  if (pid == 0) {27    // Child process28    char foo[30];29    for (int i = 0; i < 30; i++)30      foo[i] = (foo[i] != 42) ? 42 : 24;31    return;32  }33  ASSERT_TRUE(pid > 0);34  int status;35  pid_t cpid = LIBC_NAMESPACE::wait(&status);36  ASSERT_TRUE(cpid > 0);37  ASSERT_EQ(cpid, pid);38  ASSERT_TRUE(WIFEXITED(status));39}40 41void stack_smashing_abort() {42  pid_t pid = LIBC_NAMESPACE::fork();43  if (pid == 0) {44    // Child process45    char foo[30];46    char *frame_ptr = static_cast<char *>(__builtin_frame_address(0));47    char *cur_ptr = &foo[0];48    // Corrupt the stack49    while (cur_ptr != frame_ptr) {50      *cur_ptr = (*cur_ptr != 42) ? 42 : 24;51      cur_ptr++;52    }53    return;54  }55  ASSERT_TRUE(pid > 0);56  int status;57  pid_t cpid = LIBC_NAMESPACE::wait(&status);58  ASSERT_TRUE(cpid > 0);59  ASSERT_EQ(cpid, pid);60  ASSERT_TRUE(WTERMSIG(status) == SIGABRT);61}62 63TEST_MAIN(int argc, char **argv, char **envp) {64  no_stack_smashing_normal_exit();65  stack_smashing_abort();66  return 0;67}68