[compiler-rt] r304858 - [tsan]: Fix GNU version of strerror_r interceptor

Vitaly Buka via llvm-commits llvm-commits at lists.llvm.org
Wed Jun 7 10:58:10 PDT 2017


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

On Tue, Jun 6, 2017 at 6:53 PM, Vitaly Buka via llvm-commits <
llvm-commits at lists.llvm.org> wrote:

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


More information about the llvm-commits mailing list