<div dir="ltr">Differential Revision: <a href="https://reviews.llvm.org/D27062">https://reviews.llvm.org/D27062</a><br></div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Jun 6, 2017 at 6:53 PM, Vitaly Buka via llvm-commits <span dir="ltr"><<a href="mailto:llvm-commits@lists.llvm.org" target="_blank">llvm-commits@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: vitalybuka<br>
Date: Tue Jun  6 20:53:38 2017<br>
New Revision: 304858<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=304858&view=rev" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project?rev=304858&view=rev</a><br>
Log:<br>
[tsan]: Fix GNU version of strerror_r interceptor<br>
<br>
GNU version of strerror_r returns a result pointer that doesn't match the input<br>
buffer. The result pointer is in fact a pointer to some internal storage.<br>
TSAN was recording a write to this location, which was incorrect.<br>
<br>
Fixed <a href="https://github.com/google/sanitizers/issues/696" rel="noreferrer" target="_blank">https://github.com/google/<wbr>sanitizers/issues/696</a><br>
<br>
Added:<br>
    compiler-rt/trunk/test/msan/<wbr>Linux/strerror_r.cc<br>
    compiler-rt/trunk/test/tsan/<wbr>strerror_r.cc<br>
Modified:<br>
    compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>common_interceptors.inc<br>
    compiler-rt/trunk/lib/tsan/<wbr>rtl/tsan_rtl_thread.cc<br>
<br>
Modified: compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>common_interceptors.inc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/sanitizer_common/sanitizer_common_interceptors.inc?rev=304858&r1=304857&r2=304858&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>common_interceptors.inc?rev=<wbr>304858&r1=304857&r2=304858&<wbr>view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>common_interceptors.inc (original)<br>
+++ compiler-rt/trunk/lib/<wbr>sanitizer_common/sanitizer_<wbr>common_interceptors.inc Tue Jun  6 20:53:38 2017<br>
@@ -3395,7 +3395,10 @@ INTERCEPTOR(char *, strerror_r, int errn<br>
   // its metadata. See<br>
   // <a href="https://github.com/google/sanitizers/issues/321" rel="noreferrer" target="_blank">https://github.com/google/<wbr>sanitizers/issues/321</a>.<br>
   char *res = REAL(strerror_r)(errnum, buf, buflen);<br>
-  COMMON_INTERCEPTOR_WRITE_<wbr>RANGE(ctx, res, REAL(strlen)(res) + 1);<br>
+  if (res == buf)<br>
+    COMMON_INTERCEPTOR_WRITE_<wbr>RANGE(ctx, res, REAL(strlen)(res) + 1);<br>
+  else<br>
+    COMMON_INTERCEPTOR_INITIALIZE_<wbr>RANGE(res, REAL(strlen)(res) + 1);<br>
   return res;<br>
 }<br>
 #endif //(_POSIX_C_SOURCE >= 200112L || _XOPEN_SOURCE >= 600) && !_GNU_SOURCE ||<br>
<br>
Modified: compiler-rt/trunk/lib/tsan/<wbr>rtl/tsan_rtl_thread.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/tsan/rtl/tsan_rtl_thread.cc?rev=304858&r1=304857&r2=304858&view=diff" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/lib/<wbr>tsan/rtl/tsan_rtl_thread.cc?<wbr>rev=304858&r1=304857&r2=<wbr>304858&view=diff</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/lib/tsan/<wbr>rtl/tsan_rtl_thread.cc (original)<br>
+++ compiler-rt/trunk/lib/tsan/<wbr>rtl/tsan_rtl_thread.cc Tue Jun  6 20:53:38 2017<br>
@@ -345,6 +345,7 @@ void MemoryAccessRange(ThreadState *thr,<br>
   StatInc(thr, StatMopRange);<br>
<br>
   if (*shadow_mem == kShadowRodata) {<br>
+    DCHECK(!is_write);<br>
     // Access to .rodata section, no races here.<br>
     // Measurements show that it can be 10-20% of all memory accesses.<br>
     StatInc(thr, StatMopRangeRodata);<br>
<br>
Added: compiler-rt/trunk/test/msan/<wbr>Linux/strerror_r.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/msan/Linux/strerror_r.cc?rev=304858&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/msan/Linux/strerror_r.cc?<wbr>rev=304858&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/msan/<wbr>Linux/strerror_r.cc (added)<br>
+++ compiler-rt/trunk/test/msan/<wbr>Linux/strerror_r.cc Tue Jun  6 20:53:38 2017<br>
@@ -0,0 +1,18 @@<br>
+// RUN: %clang_msan -O0 -g %s -o %t && %run %t<br>
+<br>
+#include <assert.h><br>
+#include <errno.h><br>
+#include <string.h><br>
+<br>
+int main() {<br>
+  char buf[1000];<br>
+  char *res = strerror_r(EINVAL, buf, sizeof(buf));<br>
+  assert(res);<br>
+  volatile int z = strlen(res);<br>
+<br>
+  res = strerror_r(-1, buf, sizeof(buf));<br>
+  assert(res);<br>
+  z = strlen(res);<br>
+<br>
+  return 0;<br>
+}<br>
<br>
Added: compiler-rt/trunk/test/tsan/<wbr>strerror_r.cc<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/test/tsan/strerror_r.cc?rev=304858&view=auto" rel="noreferrer" target="_blank">http://llvm.org/viewvc/llvm-<wbr>project/compiler-rt/trunk/<wbr>test/tsan/strerror_r.cc?rev=<wbr>304858&view=auto</a><br>
==============================<wbr>==============================<wbr>==================<br>
--- compiler-rt/trunk/test/tsan/<wbr>strerror_r.cc (added)<br>
+++ compiler-rt/trunk/test/tsan/<wbr>strerror_r.cc Tue Jun  6 20:53:38 2017<br>
@@ -0,0 +1,28 @@<br>
+// RUN: %clangxx_tsan -O1 -DTEST_ERROR=ERANGE %s -o %t && %run %t 2>&1 | FileCheck --check-prefixes=CHECK,CHECK-<wbr>SYS %s<br>
+// RUN: %clangxx_tsan -O1 -DTEST_ERROR=-1 %s -o %t && not %run %t 2>&1 | FileCheck --check-prefixes=CHECK,CHECK-<wbr>USER %s<br>
+<br>
+#include <assert.h><br>
+#include <errno.h><br>
+#include <pthread.h><br>
+#include <stdio.h><br>
+#include <string.h><br>
+<br>
+char buffer[1000];<br>
+<br>
+void *Thread(void *p) {<br>
+  return strerror_r(TEST_ERROR, buffer, sizeof(buffer));<br>
+}<br>
+<br>
+int main() {<br>
+  pthread_t th[2];<br>
+  pthread_create(&th[0], 0, Thread, 0);<br>
+  pthread_create(&th[1], 0, Thread, 0);<br>
+  pthread_join(th[0], 0);<br>
+  pthread_join(th[1], 0);<br>
+  fprintf(stderr, "DONE\n");<br>
+}<br>
+<br>
+// CHECK-USER: WARNING: ThreadSanitizer: data race<br>
+// CHECK-SYS-NOT: WARNING: ThreadSanitizer: data race<br>
+<br>
+// CHECK: DONE<br>
<br>
<br>
______________________________<wbr>_________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@lists.llvm.org">llvm-commits@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-commits" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div>