ptrace.cc revision 2d1fdb26e458c4ddc04155c1d421bced3ba90cd0
12d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O0 %s -o %t && %run %t
22d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -DPOSITIVE -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s
3341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
4341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <assert.h>
5341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <stdio.h>
6341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/ptrace.h>
7341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/types.h>
8341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/user.h>
9341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/wait.h>
10341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <unistd.h>
11341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
12341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanovint main(void) {
13341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  pid_t pid;
14341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  pid = fork();
15341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  if (pid == 0) { // child
16341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    ptrace(PTRACE_TRACEME, 0, NULL, NULL);
17341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    execl("/bin/true", "true", NULL);
18341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  } else {
19341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    wait(NULL);
20341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    user_regs_struct regs;
21341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    int res;
22341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    user_regs_struct * volatile pregs = &regs;
23341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#ifdef POSITIVE
24341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    ++pregs;
25341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif
26341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    res = ptrace(PTRACE_GETREGS, pid, NULL, pregs);
27341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    // CHECK: AddressSanitizer: stack-buffer-overflow
28341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    // CHECK: {{.*ptrace.cc:}}[[@LINE-2]]
29341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    assert(!res);
30341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#if __WORDSIZE == 64
31341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    printf("%zx\n", regs.rip);
32341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#else
33341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    printf("%lx\n", regs.eip);
34341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif
35341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
36341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    user_fpregs_struct fpregs;
37341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    res = ptrace(PTRACE_GETFPREGS, pid, NULL, &fpregs);
38341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    assert(!res);
39341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    printf("%lx\n", (unsigned long)fpregs.cwd);
40341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
41341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#if __WORDSIZE == 32
42341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    user_fpxregs_struct fpxregs;
43341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    res = ptrace(PTRACE_GETFPXREGS, pid, NULL, &fpxregs);
44341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    assert(!res);
45341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    printf("%lx\n", (unsigned long)fpxregs.mxcsr);
46341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif
47341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov
48341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    ptrace(PTRACE_CONT, pid, NULL, NULL);
49341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov    wait(NULL);
50341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  }
51341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov  return 0;
52341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov}
53