1 //===-- sanitizer_posix_libcdep.cc ----------------------------------------===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 // 10 // This file is shared between AddressSanitizer and ThreadSanitizer 11 // run-time libraries and implements libc-dependent POSIX-specific functions 12 // from sanitizer_libc.h. 13 //===----------------------------------------------------------------------===// 14 15 #include "sanitizer_platform.h" 16 17 #if SANITIZER_LINUX || SANITIZER_MAC 18 #include "sanitizer_common.h" 19 #include "sanitizer_stacktrace.h" 20 21 #include <errno.h> 22 #include <pthread.h> 23 #include <stdlib.h> 24 #include <sys/mman.h> 25 #include <sys/resource.h> 26 #include <sys/time.h> 27 #include <sys/types.h> 28 #include <unistd.h> 29 30 namespace __sanitizer { 31 32 u32 GetUid() { 33 return getuid(); 34 } 35 36 uptr GetThreadSelf() { 37 return (uptr)pthread_self(); 38 } 39 40 void FlushUnneededShadowMemory(uptr addr, uptr size) { 41 madvise((void*)addr, size, MADV_DONTNEED); 42 } 43 44 void DisableCoreDumper() { 45 struct rlimit nocore; 46 nocore.rlim_cur = 0; 47 nocore.rlim_max = 0; 48 setrlimit(RLIMIT_CORE, &nocore); 49 } 50 51 bool StackSizeIsUnlimited() { 52 struct rlimit rlim; 53 CHECK_EQ(0, getrlimit(RLIMIT_STACK, &rlim)); 54 return (rlim.rlim_cur == (uptr)-1); 55 } 56 57 void SetStackSizeLimitInBytes(uptr limit) { 58 struct rlimit rlim; 59 rlim.rlim_cur = limit; 60 rlim.rlim_max = limit; 61 if (setrlimit(RLIMIT_STACK, &rlim)) { 62 Report("ERROR: %s setrlimit() failed %d\n", SanitizerToolName, errno); 63 Die(); 64 } 65 CHECK(!StackSizeIsUnlimited()); 66 } 67 68 void SleepForSeconds(int seconds) { 69 sleep(seconds); 70 } 71 72 void SleepForMillis(int millis) { 73 usleep(millis * 1000); 74 } 75 76 void Abort() { 77 abort(); 78 } 79 80 int Atexit(void (*function)(void)) { 81 #ifndef SANITIZER_GO 82 return atexit(function); 83 #else 84 return 0; 85 #endif 86 } 87 88 int internal_isatty(fd_t fd) { 89 return isatty(fd); 90 } 91 92 #ifndef SANITIZER_GO 93 void GetStackTrace(StackTrace *stack, uptr max_s, uptr pc, uptr bp, 94 uptr stack_top, uptr stack_bottom, bool fast) { 95 #if !SANITIZER_CAN_FAST_UNWIND 96 fast = false; 97 #endif 98 #if SANITIZER_MAC 99 // Always unwind fast on Mac. 100 (void)fast; 101 #else 102 if (!fast) 103 return stack->SlowUnwindStack(pc, max_s); 104 #endif // SANITIZER_MAC 105 stack->size = 0; 106 stack->trace[0] = pc; 107 if (max_s > 1) { 108 stack->max_size = max_s; 109 stack->FastUnwindStack(pc, bp, stack_top, stack_bottom); 110 } 111 } 112 #endif // SANITIZER_GO 113 114 } // namespace __sanitizer 115 116 #endif 117