[TSan] Share the code the setup code calling getrlim/setrlim with sanitizer_common
llvm-svn: 215481
This commit is contained in:
parent
5ab8750c5c
commit
34e2b280da
|
@ -611,9 +611,7 @@ static void AsanInitInternal() {
|
|||
if (common_flags()->verbosity)
|
||||
PrintAddressSpaceLayout();
|
||||
|
||||
if (common_flags()->disable_coredump) {
|
||||
DisableCoreDumper();
|
||||
}
|
||||
DisableCoreDumperIfNecessary();
|
||||
|
||||
if (full_shadow_is_available) {
|
||||
// mmap the low shadow plus at least one page at the left.
|
||||
|
|
|
@ -176,7 +176,7 @@ void PrintModuleAndOffset(InternalScopedString *buffer,
|
|||
const char *module, uptr offset);
|
||||
|
||||
// OS
|
||||
void DisableCoreDumper();
|
||||
void DisableCoreDumperIfNecessary();
|
||||
void DumpProcessMap();
|
||||
bool FileExists(const char *filename);
|
||||
const char *GetEnv(const char *name);
|
||||
|
@ -187,6 +187,8 @@ u32 GetUid();
|
|||
void ReExec();
|
||||
bool StackSizeIsUnlimited();
|
||||
void SetStackSizeLimitInBytes(uptr limit);
|
||||
bool AddressSpaceIsUnlimited();
|
||||
void SetAddressSpaceUnlimited();
|
||||
void AdjustStackSize(void *attr);
|
||||
void PrepareForSandboxing(__sanitizer_sandbox_arguments *args);
|
||||
void CovPrepareForSandboxing(__sanitizer_sandbox_arguments *args);
|
||||
|
|
|
@ -44,30 +44,49 @@ void FlushUnneededShadowMemory(uptr addr, uptr size) {
|
|||
madvise((void*)addr, size, MADV_DONTNEED);
|
||||
}
|
||||
|
||||
void DisableCoreDumper() {
|
||||
struct rlimit nocore;
|
||||
nocore.rlim_cur = 0;
|
||||
nocore.rlim_max = 0;
|
||||
setrlimit(RLIMIT_CORE, &nocore);
|
||||
static rlim_t getlim(int res) {
|
||||
rlimit rlim;
|
||||
CHECK_EQ(0, getrlimit(res, &rlim));
|
||||
return rlim.rlim_cur;
|
||||
}
|
||||
|
||||
bool StackSizeIsUnlimited() {
|
||||
struct rlimit rlim;
|
||||
CHECK_EQ(0, getrlimit(RLIMIT_STACK, &rlim));
|
||||
return ((uptr)rlim.rlim_cur == (uptr)-1);
|
||||
}
|
||||
|
||||
void SetStackSizeLimitInBytes(uptr limit) {
|
||||
struct rlimit rlim;
|
||||
rlim.rlim_cur = limit;
|
||||
rlim.rlim_max = limit;
|
||||
if (setrlimit(RLIMIT_STACK, &rlim)) {
|
||||
static void setlim(int res, rlim_t lim) {
|
||||
// The following magic is to prevent clang from replacing it with memset.
|
||||
volatile struct rlimit rlim;
|
||||
rlim.rlim_cur = lim;
|
||||
rlim.rlim_max = lim;
|
||||
if (setrlimit(res, (struct rlimit*)&rlim)) {
|
||||
Report("ERROR: %s setrlimit() failed %d\n", SanitizerToolName, errno);
|
||||
Die();
|
||||
}
|
||||
}
|
||||
|
||||
void DisableCoreDumperIfNecessary() {
|
||||
if (common_flags()->disable_coredump) {
|
||||
setlim(RLIMIT_CORE, 0);
|
||||
}
|
||||
}
|
||||
|
||||
bool StackSizeIsUnlimited() {
|
||||
rlim_t stack_size = getlim(RLIMIT_STACK);
|
||||
return (stack_size == (rlim_t)-1);
|
||||
}
|
||||
|
||||
void SetStackSizeLimitInBytes(uptr limit) {
|
||||
setlim(RLIMIT_STACK, (rlim_t)limit);
|
||||
CHECK(!StackSizeIsUnlimited());
|
||||
}
|
||||
|
||||
bool AddressSpaceIsUnlimited() {
|
||||
rlim_t as_size = getlim(RLIMIT_AS);
|
||||
return (as_size == (rlim_t)-1);
|
||||
}
|
||||
|
||||
void SetAddressSpaceUnlimited() {
|
||||
setlim(RLIMIT_AS, -1);
|
||||
CHECK(AddressSpaceIsUnlimited());
|
||||
}
|
||||
|
||||
void SleepForSeconds(int seconds) {
|
||||
sleep(seconds);
|
||||
}
|
||||
|
|
|
@ -189,7 +189,7 @@ void DumpProcessMap() {
|
|||
UNIMPLEMENTED();
|
||||
}
|
||||
|
||||
void DisableCoreDumper() {
|
||||
void DisableCoreDumperIfNecessary() {
|
||||
// Do nothing.
|
||||
}
|
||||
|
||||
|
@ -210,6 +210,14 @@ void SetStackSizeLimitInBytes(uptr limit) {
|
|||
UNIMPLEMENTED();
|
||||
}
|
||||
|
||||
bool AddressSpaceIsUnlimited() {
|
||||
UNIMPLEMENTED();
|
||||
}
|
||||
|
||||
void SetAddressSpaceUnlimited() {
|
||||
UNIMPLEMENTED();
|
||||
}
|
||||
|
||||
char *FindPathToBinary(const char *name) {
|
||||
// Nothing here for now.
|
||||
return 0;
|
||||
|
|
|
@ -332,25 +332,8 @@ static void InitDataSeg() {
|
|||
|
||||
#endif // #ifndef TSAN_GO
|
||||
|
||||
static rlim_t getlim(int res) {
|
||||
rlimit rlim;
|
||||
CHECK_EQ(0, getrlimit(res, &rlim));
|
||||
return rlim.rlim_cur;
|
||||
}
|
||||
|
||||
static void setlim(int res, rlim_t lim) {
|
||||
// The following magic is to prevent clang from replacing it with memset.
|
||||
volatile rlimit rlim;
|
||||
rlim.rlim_cur = lim;
|
||||
rlim.rlim_max = lim;
|
||||
setrlimit(res, (rlimit*)&rlim);
|
||||
}
|
||||
|
||||
const char *InitializePlatform() {
|
||||
if (common_flags()->disable_coredump) {
|
||||
// Disable core dumps, dumping of 16TB usually takes a bit long.
|
||||
setlim(RLIMIT_CORE, 0);
|
||||
}
|
||||
DisableCoreDumperIfNecessary();
|
||||
|
||||
// Go maps shadow memory lazily and works fine with limited address space.
|
||||
// Unlimited stack is not a problem as well, because the executable
|
||||
|
@ -360,7 +343,7 @@ const char *InitializePlatform() {
|
|||
// TSan doesn't play well with unlimited stack size (as stack
|
||||
// overlaps with shadow memory). If we detect unlimited stack size,
|
||||
// we re-exec the program with limited stack size as a best effort.
|
||||
if (getlim(RLIMIT_STACK) == (rlim_t)-1) {
|
||||
if (StackSizeIsUnlimited()) {
|
||||
const uptr kMaxStackSize = 32 * 1024 * 1024;
|
||||
VReport(1, "Program is run with unlimited stack size, which wouldn't "
|
||||
"work with ThreadSanitizer.\n"
|
||||
|
@ -370,11 +353,11 @@ const char *InitializePlatform() {
|
|||
reexec = true;
|
||||
}
|
||||
|
||||
if (getlim(RLIMIT_AS) != (rlim_t)-1) {
|
||||
if (!AddressSpaceIsUnlimited()) {
|
||||
Report("WARNING: Program is run with limited virtual address space,"
|
||||
" which wouldn't work with ThreadSanitizer.\n");
|
||||
Report("Re-execing with unlimited virtual address space.\n");
|
||||
setlim(RLIMIT_AS, -1);
|
||||
SetAddressSpaceUnlimited();
|
||||
reexec = true;
|
||||
}
|
||||
if (reexec)
|
||||
|
|
|
@ -74,16 +74,7 @@ void InitializeShadowMemory() {
|
|||
#endif
|
||||
|
||||
const char *InitializePlatform() {
|
||||
void *p = 0;
|
||||
if (sizeof(p) == 8) {
|
||||
// Disable core dumps, dumping of 16TB usually takes a bit long.
|
||||
// The following magic is to prevent clang from replacing it with memset.
|
||||
volatile rlimit lim;
|
||||
lim.rlim_cur = 0;
|
||||
lim.rlim_max = 0;
|
||||
setrlimit(RLIMIT_CORE, (rlimit*)&lim);
|
||||
}
|
||||
|
||||
DisableCoreDumperIfNecessary();
|
||||
return GetEnv(kTsanOptionsEnv);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue