[compiler-rt] r194572 - [asan] fix a leak in tds (https://code.google.com/p/address-sanitizer/issues/detail?id=233)
Kostya Serebryany
kcc at google.com
Wed Nov 13 05:27:44 PST 2013
Author: kcc
Date: Wed Nov 13 07:27:44 2013
New Revision: 194572
URL: http://llvm.org/viewvc/llvm-project?rev=194572&view=rev
Log:
[asan] fix a leak in tds (https://code.google.com/p/address-sanitizer/issues/detail?id=233)
Added:
compiler-rt/trunk/lib/asan/lit_tests/TestCases/Linux/tsd_dtor_leak.cc
Modified:
compiler-rt/trunk/lib/asan/asan_thread.cc
Modified: compiler-rt/trunk/lib/asan/asan_thread.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_thread.cc?rev=194572&r1=194571&r2=194572&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_thread.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_thread.cc Wed Nov 13 07:27:44 2013
@@ -99,6 +99,8 @@ void AsanThread::Destroy() {
Report("T%d exited\n", tid());
}
+ malloc_storage().CommitBack();
+ if (flags()->use_sigaltstack) UnsetAlternateSignalStack();
asanThreadRegistry().FinishThread(tid());
FlushToDeadThreadStats(&stats_);
// We also clear the shadow on thread destruction because
@@ -165,8 +167,6 @@ thread_return_t AsanThread::ThreadStart(
}
thread_return_t res = start_routine_(arg_);
- malloc_storage().CommitBack();
- if (flags()->use_sigaltstack) UnsetAlternateSignalStack();
// On POSIX systems we defer this to the TSD destructor. LSan will consider
// the thread's memory as non-live from the moment we call Destroy(), even
Added: compiler-rt/trunk/lib/asan/lit_tests/TestCases/Linux/tsd_dtor_leak.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/lit_tests/TestCases/Linux/tsd_dtor_leak.cc?rev=194572&view=auto
==============================================================================
--- compiler-rt/trunk/lib/asan/lit_tests/TestCases/Linux/tsd_dtor_leak.cc (added)
+++ compiler-rt/trunk/lib/asan/lit_tests/TestCases/Linux/tsd_dtor_leak.cc Wed Nov 13 07:27:44 2013
@@ -0,0 +1,39 @@
+// Regression test for a leak in tsd:
+// https://code.google.com/p/address-sanitizer/issues/detail?id=233
+// RUN: %clangxx_asan -O1 %s -o %t
+// RUN: ASAN_OPTIONS=quarantine_size=1 %t
+#include <pthread.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <assert.h>
+
+extern "C" size_t __asan_get_heap_size();
+static pthread_key_t tsd_key;
+
+void *Thread(void *) {
+ pthread_setspecific(tsd_key, malloc(10));
+ return 0;
+}
+
+static volatile void *v;
+
+void Dtor(void *tsd) {
+ v = malloc(10000);
+ free(tsd);
+ free((void*)v); // The bug was that this was leaking.
+}
+
+int main() {
+ assert(0 == pthread_key_create(&tsd_key, Dtor));
+ size_t old_heap_size = 0;
+ for (int i = 0; i < 10; i++) {
+ pthread_t t;
+ pthread_create(&t, 0, Thread, 0);
+ pthread_join(t, 0);
+ size_t new_heap_size = __asan_get_heap_size();
+ fprintf(stderr, "heap size: new: %zd old: %zd\n", new_heap_size, old_heap_size);
+ if (old_heap_size)
+ assert(old_heap_size == new_heap_size);
+ old_heap_size = new_heap_size;
+ }
+}
More information about the llvm-commits
mailing list