[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