[PATCH] D58221: [msan] Don't delete MSanAtExitRecord
Vitaly Buka via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Wed Feb 13 18:51:32 PST 2019
This revision was automatically updated to reflect the committed changes.
Closed by commit rCRT354005: [msan] Don't delete MSanAtExitRecord (authored by vitalybuka, committed by ).
Changed prior to commit:
https://reviews.llvm.org/D58221?vs=186786&id=186787#toc
Repository:
rCRT Compiler Runtime
CHANGES SINCE LAST ACTION
https://reviews.llvm.org/D58221/new/
https://reviews.llvm.org/D58221
Files:
lib/msan/msan_interceptors.cc
test/msan/cxa_atexit_race.cc
Index: test/msan/cxa_atexit_race.cc
===================================================================
--- test/msan/cxa_atexit_race.cc
+++ test/msan/cxa_atexit_race.cc
@@ -0,0 +1,35 @@
+// RUN: %clangxx_msan %s -o %t && %run %t 2>&1 | FileCheck %s
+
+#include <atomic>
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+
+extern "C" int
+__cxa_atexit(void (*func)(void *), void *arg, void *d);
+
+void handler(void *) {
+}
+
+std::atomic_int counter;
+
+void *thread(void *) {
+ for (int i = 0; i < 10000; ++i) {
+ __cxa_atexit(&handler, 0, (void *)&handler);
+ ++counter;
+ }
+ return 0;
+}
+
+int main(void) {
+ printf("TEST_MAIN\n");
+ pthread_t pt;
+ for (int i = 0; i < 2; ++i)
+ pthread_create(&pt, 0, &thread, 0);
+ while (counter < 1000) {
+ };
+ return 0;
+}
+// CHECK: TEST_MAIN
+// CHECK-NOT: MemorySanitizer
Index: lib/msan/msan_interceptors.cc
===================================================================
--- lib/msan/msan_interceptors.cc
+++ lib/msan/msan_interceptors.cc
@@ -1118,8 +1118,12 @@
void MSanCxaAtExitWrapper(void *arg) {
UnpoisonParam(1);
MSanAtExitRecord *r = (MSanAtExitRecord *)arg;
+ // libc before 2.27 had race which caused occasional double handler execution
+ // https://sourceware.org/ml/libc-alpha/2017-08/msg01204.html
+ if (!r->func)
+ return;
r->func(r->arg);
- InternalFree(r);
+ r->func = nullptr;
}
static int setup_at_exit_wrapper(void(*f)(), void *arg, void *dso);
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D58221.186787.patch
Type: text/x-patch
Size: 1493 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190214/05ac765a/attachment.bin>
More information about the llvm-commits
mailing list