16a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// FIXME: https://code.google.com/p/address-sanitizer/issues/detail?id=316 26a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// XFAIL: android 3799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar// XFAIL: mips 46a211c5814e25d6745a5058cc0e499e5235d3821Stephen Hines// 52d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -O0 %s -o %t && %run %t 62d1fdb26e458c4ddc04155c1d421bced3ba90cd0Stephen Hines// RUN: %clangxx_asan -DPOSITIVE -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s 7341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 8341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <assert.h> 9341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <stdio.h> 10341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/ptrace.h> 11341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/types.h> 12341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/user.h> 13341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <sys/wait.h> 14341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#include <unistd.h> 15799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#include <sys/uio.h> // for iovec 16799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#include <elf.h> // for NT_PRSTATUS 17799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifdef __aarch64__ 18799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# include <asm/ptrace.h> 19799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif 20799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 21799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#if defined(__i386__) || defined(__x86_64__) 22799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef user_regs_struct regs_struct; 23799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef user_fpregs_struct fpregs_struct; 24799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#if defined(__i386__) 25799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define REG_IP eip 26799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#else 27799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define REG_IP rip 28799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif 29799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_PC(__regs) printf ("%lx\n", (unsigned long) (__regs.REG_IP)) 30799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_FP(__fpregs) printf ("%lx\n", (unsigned long) (__fpregs.cwd)) 31799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define __PTRACE_FPREQUEST PTRACE_GETFPREGS 32799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 33799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#elif defined(__aarch64__) 34799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef struct user_pt_regs regs_struct; 35799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef struct user_fpsimd_state fpregs_struct; 36799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_PC(__regs) printf ("%x\n", (unsigned) (__regs.pc)) 37799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_FP(__fpregs) printf ("%x\n", (unsigned) (__fpregs.fpsr)) 38799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define ARCH_IOVEC_FOR_GETREGSET 39799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 40799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#elif defined(__powerpc64__) 41799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef struct pt_regs regs_struct; 42799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef elf_fpregset_t fpregs_struct; 43799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_PC(__regs) printf ("%lx\n", (unsigned long) (__regs.nip)) 44799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_FP(__fpregs) printf ("%lx\n", (elf_greg_t)fpregs[32]) 45799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define ARCH_IOVEC_FOR_GETREGSET 46799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 47799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#elif defined(__mips__) 48799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef struct pt_regs regs_struct; 49799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef elf_fpregset_t fpregs_struct; 50799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_PC(__regs) printf ("%lx\n", (unsigned long) (__regs.cp0_epc)) 51799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_FP(__fpregs) printf ("%lx\n", (elf_greg_t) (__fpregs[32])) 52799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define __PTRACE_FPREQUEST PTRACE_GETFPREGS 53799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 54799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#elif defined(__arm__) 55799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# include <asm/ptrace.h> 56799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# include <sys/procfs.h> 57799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef struct pt_regs regs_struct; 58799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainartypedef char fpregs_struct[ARM_VFPREGS_SIZE]; 59799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_PC(__regs) printf ("%x\n", (unsigned) (__regs.ARM_pc)) 60799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define PRINT_REG_FP(__fpregs) printf ("%x\n", (unsigned) (__fpregs + 32 * 8)) 61799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#define __PTRACE_FPREQUEST PTRACE_GETVFPREGS 62c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar 63c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#elif defined(__s390__) 64c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainartypedef _user_regs_struct regs_struct; 65c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainartypedef _user_fpregs_struct fpregs_struct; 66c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define PRINT_REG_PC(__regs) printf ("%lx\n", (unsigned long) (__regs.psw.addr)) 67c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define PRINT_REG_FP(__fpregs) printf ("%lx\n", (unsigned long) (__fpregs.fpc)) 68c58a43648cd6121c51a2e795a28e2ef90d7813e6Pirama Arumuga Nainar#define ARCH_IOVEC_FOR_GETREGSET 69799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif 70799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 71341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 72341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanovint main(void) { 73341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov pid_t pid; 74341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov pid = fork(); 75341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov if (pid == 0) { // child 76341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov ptrace(PTRACE_TRACEME, 0, NULL, NULL); 77341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov execl("/bin/true", "true", NULL); 78341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov } else { 79341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov wait(NULL); 80799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar regs_struct regs; 81799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar regs_struct* volatile pregs = ®s; 82799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifdef ARCH_IOVEC_FOR_GETREGSET 83799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar struct iovec regset_io; 84799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif 85341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov int res; 86799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 87341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#ifdef POSITIVE 88341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov ++pregs; 89341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif 90799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 91799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifdef ARCH_IOVEC_FOR_GETREGSET 92799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# define __PTRACE_REQUEST PTRACE_GETREGSET 93799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# define __PTRACE_ARGS (void*)NT_PRSTATUS, (void*)®set_io 94799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar regset_io.iov_base = pregs; 95799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar regset_io.iov_len = sizeof(regs_struct); 96799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#else 97799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# define __PTRACE_REQUEST PTRACE_GETREGS 98799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# define __PTRACE_ARGS NULL, pregs 99799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#endif 100799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar res = ptrace((enum __ptrace_request)__PTRACE_REQUEST, pid, __PTRACE_ARGS); 101341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov // CHECK: AddressSanitizer: stack-buffer-overflow 102341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov // CHECK: {{.*ptrace.cc:}}[[@LINE-2]] 103341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov assert(!res); 104799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar PRINT_REG_PC(regs); 105799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar 106799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar fpregs_struct fpregs; 107799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifdef ARCH_IOVEC_FOR_GETREGSET 108799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# define __PTRACE_FPREQUEST PTRACE_GETREGSET 109799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# define __PTRACE_FPARGS (void*)NT_PRSTATUS, (void*)®set_io 110799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar regset_io.iov_base = &fpregs; 111799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar regset_io.iov_len = sizeof(fpregs_struct); 112799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar res = ptrace((enum __ptrace_request)PTRACE_GETREGSET, pid, (void*)NT_FPREGSET, 113799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar (void*)®set_io); 114341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#else 115799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar# define __PTRACE_FPARGS NULL, &fpregs 116341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif 117799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar res = ptrace((enum __ptrace_request)__PTRACE_FPREQUEST, pid, __PTRACE_FPARGS); 118341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov assert(!res); 119799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar PRINT_REG_FP(fpregs); 120341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 121799172d60d32feb1acba1a6867f3a9c39a999e5cPirama Arumuga Nainar#ifdef __i386__ 122341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov user_fpxregs_struct fpxregs; 123341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov res = ptrace(PTRACE_GETFPXREGS, pid, NULL, &fpxregs); 124341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov assert(!res); 125341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov printf("%lx\n", (unsigned long)fpxregs.mxcsr); 126341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov#endif 127341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov 128341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov ptrace(PTRACE_CONT, pid, NULL, NULL); 129341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov wait(NULL); 130341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov } 131341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov return 0; 132341b9e63f63a8eacf1b699d4c79edee55241ebe6Evgeniy Stepanov} 133