tsan: fix latent bug in shadow computation
authorDmitry Vyukov <dvyukov@google.com>
Fri, 13 Aug 2021 13:24:23 +0000 (15:24 +0200)
committerDmitry Vyukov <dvyukov@google.com>
Fri, 13 Aug 2021 14:38:56 +0000 (16:38 +0200)
We use kShadowCnt (number of shadow cells per application granule)
when computing shadow, but it's wrong. We need the ratio
between shadow and app memory (how much shadow is larger than app memory),
which is kShadowMultiplier.
Currently both are equal to 4, so it works fine.
Use the correct constant.

Reviewed By: melver

Differential Revision: https://reviews.llvm.org/D108033

compiler-rt/lib/tsan/rtl/tsan_platform.h

index e36ef21..30a1be5 100644 (file)
@@ -840,7 +840,7 @@ struct MemToShadowImpl {
     DCHECK(IsAppMemImpl::Apply<Mapping>(x));
     return (((x) & ~(Mapping::kShadowMsk | (kShadowCell - 1))) ^
             Mapping::kShadowXor) *
-               kShadowCnt +
+               kShadowMultiplier +
            Mapping::kShadowAdd;
   }
 };
@@ -873,7 +873,8 @@ struct ShadowToMemImpl {
     // a bijection, so we try to restore the address as belonging to
     // low/mid/high range consecutively and see if shadow->app->shadow mapping
     // gives us the same address.
-    uptr p = ((sp - Mapping::kShadowAdd) / kShadowCnt) ^ Mapping::kShadowXor;
+    uptr p =
+        ((sp - Mapping::kShadowAdd) / kShadowMultiplier) ^ Mapping::kShadowXor;
     if (p >= Mapping::kLoAppMemBeg && p < Mapping::kLoAppMemEnd &&
         MemToShadowImpl::Apply<Mapping>(p) == sp)
       return p;