[compiler-rt] r234145 - tsan: fix munmap interceptor

Dmitry Vyukov dvyukov at google.com
Mon Apr 6 00:57:33 PDT 2015


Author: dvyukov
Date: Mon Apr  6 02:57:32 2015
New Revision: 234145

URL: http://llvm.org/viewvc/llvm-project?rev=234145&view=rev
Log:
tsan: fix munmap interceptor

MetaMap::ResetRange/FreeRange rounds the range up to at least kMetaShadowSize.
This is requried for e.g. free(malloc(0)). However, munmap returns EINVAL
and do not unmap any memory when length arguments is equal to 0.
So don't free meta shadow in this case as well.


Modified:
    compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc

Modified: compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc?rev=234145&r1=234144&r2=234145&view=diff
==============================================================================
--- compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc (original)
+++ compiler-rt/trunk/lib/tsan/rtl/tsan_interceptors.cc Mon Apr  6 02:57:32 2015
@@ -808,8 +808,11 @@ TSAN_INTERCEPTOR(void*, mmap64, void *ad
 
 TSAN_INTERCEPTOR(int, munmap, void *addr, long_t sz) {
   SCOPED_TSAN_INTERCEPTOR(munmap, addr, sz);
-  DontNeedShadowFor((uptr)addr, sz);
-  ctx->metamap.ResetRange(thr, pc, (uptr)addr, (uptr)sz);
+  if (sz != 0) {
+    // If sz == 0, munmap will return EINVAL and don't unmap any memory.
+    DontNeedShadowFor((uptr)addr, sz);
+    ctx->metamap.ResetRange(thr, pc, (uptr)addr, (uptr)sz);
+  }
   int res = REAL(munmap)(addr, sz);
   return res;
 }





More information about the llvm-commits mailing list