1//===-- sanitizer_openbsd.cc ----------------------------------------------===// 2// 3// This file is distributed under the University of Illinois Open Source 4// License. See LICENSE.TXT for details. 5// 6//===----------------------------------------------------------------------===// 7// 8// This file is shared between various sanitizers' runtime libraries and 9// implements Solaris-specific functions. 10//===----------------------------------------------------------------------===// 11 12#include "sanitizer_platform.h" 13#if SANITIZER_OPENBSD 14 15#include <stdio.h> 16 17#include "sanitizer_common.h" 18#include "sanitizer_flags.h" 19#include "sanitizer_internal_defs.h" 20#include "sanitizer_libc.h" 21#include "sanitizer_placement_new.h" 22#include "sanitizer_platform_limits_posix.h" 23#include "sanitizer_procmaps.h" 24 25#include <errno.h> 26#include <fcntl.h> 27#include <limits.h> 28#include <pthread.h> 29#include <sched.h> 30#include <signal.h> 31#include <stdio.h> 32#include <stdlib.h> 33#include <sys/mman.h> 34#include <sys/shm.h> 35#include <sys/sysctl.h> 36#include <sys/types.h> 37#include <unistd.h> 38 39extern char **environ; 40 41namespace __sanitizer { 42 43uptr internal_mmap(void *addr, size_t length, int prot, int flags, int fd, 44 u64 offset) { 45 return (uptr)mmap(addr, length, prot, flags, fd, offset); 46} 47 48uptr internal_munmap(void *addr, uptr length) { return munmap(addr, length); } 49 50int internal_mprotect(void *addr, uptr length, int prot) { 51 return mprotect(addr, length, prot); 52} 53 54int internal_sysctlbyname(const char *sname, void *oldp, uptr *oldlenp, 55 const void *newp, uptr newlen) { 56 Printf("internal_sysctlbyname not implemented for OpenBSD"); 57 Die(); 58 return 0; 59} 60 61uptr ReadBinaryName(/*out*/char *buf, uptr buf_len) { 62 // On OpenBSD we cannot get the full path 63 struct kinfo_proc kp; 64 uptr kl; 65 const int Mib[4] = {CTL_KERN, KERN_PROC, KERN_PROC_PID, getpid()}; 66 if (internal_sysctl(Mib, ARRAY_SIZE(Mib), &kp, &kl, NULL, 0) != -1) 67 return internal_snprintf(buf, 68 (KI_MAXCOMLEN < buf_len ? KI_MAXCOMLEN : buf_len), 69 "%s", kp.p_comm); 70 return (uptr)0; 71} 72 73static void GetArgsAndEnv(char ***argv, char ***envp) { 74 uptr nargv; 75 uptr nenv; 76 int argvmib[4] = {CTL_KERN, KERN_PROC_ARGS, getpid(), KERN_PROC_ARGV}; 77 int envmib[4] = {CTL_KERN, KERN_PROC_ARGS, getpid(), KERN_PROC_ENV}; 78 if (internal_sysctl(argvmib, 4, NULL, &nargv, NULL, 0) == -1) { 79 Printf("sysctl KERN_PROC_NARGV failed\n"); 80 Die(); 81 } 82 if (internal_sysctl(envmib, 4, NULL, &nenv, NULL, 0) == -1) { 83 Printf("sysctl KERN_PROC_NENV failed\n"); 84 Die(); 85 } 86 if (internal_sysctl(argvmib, 4, &argv, &nargv, NULL, 0) == -1) { 87 Printf("sysctl KERN_PROC_ARGV failed\n"); 88 Die(); 89 } 90 if (internal_sysctl(envmib, 4, &envp, &nenv, NULL, 0) == -1) { 91 Printf("sysctl KERN_PROC_ENV failed\n"); 92 Die(); 93 } 94} 95 96char **GetArgv() { 97 char **argv, **envp; 98 GetArgsAndEnv(&argv, &envp); 99 return argv; 100} 101 102void ReExec() { 103 UNIMPLEMENTED(); 104} 105 106} // namespace __sanitizer 107 108#endif // SANITIZER_OPENBSD 109