1// FIXME: https://code.google.com/p/address-sanitizer/issues/detail?id=316 2// XFAIL: android 3// XFAIL: mips 4// 5// RUN: %clangxx_asan -O0 %s -o %t && %run %t 6// RUN: %clangxx_asan -DPOSITIVE -O0 %s -o %t && not %run %t 2>&1 | FileCheck %s 7 8#include <assert.h> 9#include <stdio.h> 10#include <sys/ptrace.h> 11#include <sys/types.h> 12#include <sys/user.h> 13#include <sys/wait.h> 14#include <unistd.h> 15#include <sys/uio.h> // for iovec 16#include <elf.h> // for NT_PRSTATUS 17#ifdef __aarch64__ 18# include <asm/ptrace.h> 19#endif 20 21#if defined(__i386__) || defined(__x86_64__) 22typedef user_regs_struct regs_struct; 23typedef user_fpregs_struct fpregs_struct; 24#if defined(__i386__) 25#define REG_IP eip 26#else 27#define REG_IP rip 28#endif 29#define PRINT_REG_PC(__regs) printf ("%lx\n", (unsigned long) (__regs.REG_IP)) 30#define PRINT_REG_FP(__fpregs) printf ("%lx\n", (unsigned long) (__fpregs.cwd)) 31#define __PTRACE_FPREQUEST PTRACE_GETFPREGS 32 33#elif defined(__aarch64__) 34typedef struct user_pt_regs regs_struct; 35typedef struct user_fpsimd_state fpregs_struct; 36#define PRINT_REG_PC(__regs) printf ("%x\n", (unsigned) (__regs.pc)) 37#define PRINT_REG_FP(__fpregs) printf ("%x\n", (unsigned) (__fpregs.fpsr)) 38#define ARCH_IOVEC_FOR_GETREGSET 39 40#elif defined(__powerpc64__) 41typedef struct pt_regs regs_struct; 42typedef elf_fpregset_t fpregs_struct; 43#define PRINT_REG_PC(__regs) printf ("%lx\n", (unsigned long) (__regs.nip)) 44#define PRINT_REG_FP(__fpregs) printf ("%lx\n", (elf_greg_t)fpregs[32]) 45#define ARCH_IOVEC_FOR_GETREGSET 46 47#elif defined(__mips__) 48typedef struct pt_regs regs_struct; 49typedef elf_fpregset_t fpregs_struct; 50#define PRINT_REG_PC(__regs) printf ("%lx\n", (unsigned long) (__regs.cp0_epc)) 51#define PRINT_REG_FP(__fpregs) printf ("%lx\n", (elf_greg_t) (__fpregs[32])) 52#define __PTRACE_FPREQUEST PTRACE_GETFPREGS 53 54#elif defined(__arm__) 55# include <asm/ptrace.h> 56# include <sys/procfs.h> 57typedef struct pt_regs regs_struct; 58typedef char fpregs_struct[ARM_VFPREGS_SIZE]; 59#define PRINT_REG_PC(__regs) printf ("%x\n", (unsigned) (__regs.ARM_pc)) 60#define PRINT_REG_FP(__fpregs) printf ("%x\n", (unsigned) (__fpregs + 32 * 8)) 61#define __PTRACE_FPREQUEST PTRACE_GETVFPREGS 62 63#elif defined(__s390__) 64typedef _user_regs_struct regs_struct; 65typedef _user_fpregs_struct fpregs_struct; 66#define PRINT_REG_PC(__regs) printf ("%lx\n", (unsigned long) (__regs.psw.addr)) 67#define PRINT_REG_FP(__fpregs) printf ("%lx\n", (unsigned long) (__fpregs.fpc)) 68#define ARCH_IOVEC_FOR_GETREGSET 69#endif 70 71 72int main(void) { 73 pid_t pid; 74 pid = fork(); 75 if (pid == 0) { // child 76 ptrace(PTRACE_TRACEME, 0, NULL, NULL); 77 execl("/bin/true", "true", NULL); 78 } else { 79 wait(NULL); 80 regs_struct regs; 81 regs_struct* volatile pregs = ®s; 82#ifdef ARCH_IOVEC_FOR_GETREGSET 83 struct iovec regset_io; 84#endif 85 int res; 86 87#ifdef POSITIVE 88 ++pregs; 89#endif 90 91#ifdef ARCH_IOVEC_FOR_GETREGSET 92# define __PTRACE_REQUEST PTRACE_GETREGSET 93# define __PTRACE_ARGS (void*)NT_PRSTATUS, (void*)®set_io 94 regset_io.iov_base = pregs; 95 regset_io.iov_len = sizeof(regs_struct); 96#else 97# define __PTRACE_REQUEST PTRACE_GETREGS 98# define __PTRACE_ARGS NULL, pregs 99#endif 100 res = ptrace((enum __ptrace_request)__PTRACE_REQUEST, pid, __PTRACE_ARGS); 101 // CHECK: AddressSanitizer: stack-buffer-overflow 102 // CHECK: {{.*ptrace.cc:}}[[@LINE-2]] 103 assert(!res); 104 PRINT_REG_PC(regs); 105 106 fpregs_struct fpregs; 107#ifdef ARCH_IOVEC_FOR_GETREGSET 108# define __PTRACE_FPREQUEST PTRACE_GETREGSET 109# define __PTRACE_FPARGS (void*)NT_PRSTATUS, (void*)®set_io 110 regset_io.iov_base = &fpregs; 111 regset_io.iov_len = sizeof(fpregs_struct); 112 res = ptrace((enum __ptrace_request)PTRACE_GETREGSET, pid, (void*)NT_FPREGSET, 113 (void*)®set_io); 114#else 115# define __PTRACE_FPARGS NULL, &fpregs 116#endif 117 res = ptrace((enum __ptrace_request)__PTRACE_FPREQUEST, pid, __PTRACE_FPARGS); 118 assert(!res); 119 PRINT_REG_FP(fpregs); 120 121#ifdef __i386__ 122 user_fpxregs_struct fpxregs; 123 res = ptrace(PTRACE_GETFPXREGS, pid, NULL, &fpxregs); 124 assert(!res); 125 printf("%lx\n", (unsigned long)fpxregs.mxcsr); 126#endif 127 128 ptrace(PTRACE_CONT, pid, NULL, NULL); 129 wait(NULL); 130 } 131 return 0; 132} 133