forked from llvm/llvm-project
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge commit '86531c48cba5' from apple/stable/20200108 into swift/master
- Loading branch information
Showing
9 changed files
with
109 additions
and
3 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
43 changes: 43 additions & 0 deletions
43
compiler-rt/test/tsan/Darwin/no_call_setenv_in_symbolize.cpp
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,43 @@ | ||
// RUN: %clangxx_tsan -O1 %s -o %t | ||
// `handle_sigbus=0` is required because when the rdar://problem/58789439 bug was | ||
// present TSan's runtime could derefence bad memory leading to SIGBUS being raised. | ||
// If the signal was caught TSan would deadlock because it would try to run the | ||
// symbolizer again. | ||
// RUN: %env_tsan_opts=handle_sigbus=0,symbolize=1 %run %t 2>&1 | FileCheck %s | ||
// RUN: %env_tsan_opts=handle_sigbus=0,symbolize=1 __check_mach_ports_lookup=some_value %run %t 2>&1 | FileCheck %s | ||
#include <sanitizer/common_interface_defs.h> | ||
#include <stdio.h> | ||
#include <stdlib.h> | ||
|
||
const char *kEnvName = "__UNLIKELY_ENV_VAR_NAME__"; | ||
|
||
int main() { | ||
if (getenv(kEnvName)) { | ||
fprintf(stderr, "Env var %s should not be set\n", kEnvName); | ||
abort(); | ||
} | ||
|
||
// This will set an environment variable that isn't already in | ||
// the environment array. This will cause Darwin's Libc to | ||
// malloc() a new array. | ||
if (setenv(kEnvName, "some_value", /*overwrite=*/1)) { | ||
fprintf(stderr, "Failed to set %s \n", kEnvName); | ||
abort(); | ||
} | ||
|
||
// rdar://problem/58789439 | ||
// Now trigger symbolization. If symbolization tries to call | ||
// to `setenv` that adds a new environment variable, then Darwin | ||
// Libc will call `realloc()` and TSan's runtime will hit | ||
// an assertion failure because TSan's runtime uses a different | ||
// allocator during symbolization which leads to `realloc()` being | ||
// called on a pointer that the allocator didn't allocate. | ||
// | ||
// CHECK: #{{[0-9]}} main {{.*}}no_call_setenv_in_symbolize.cpp:[[@LINE+1]] | ||
__sanitizer_print_stack_trace(); | ||
|
||
// CHECK: DONE | ||
fprintf(stderr, "DONE\n"); | ||
|
||
return 0; | ||
} |