sanitizer_common: don't write into .rodata
authorDmitry Vyukov <dvyukov@google.com>
Mon, 10 May 2021 11:27:06 +0000 (13:27 +0200)
committerDmitry Vyukov <dvyukov@google.com>
Wed, 12 May 2021 05:54:06 +0000 (07:54 +0200)
setlocale interceptor imitates a write into result,
which may be located in .rodata section.
This is the only interceptor that tries to do this and
I think the intention was to initialize the range for msan.
So do that instead. Writing into .rodata shouldn't happen
(without crashing later on the actual write) and this
traps on my local tsan experiments.

Reviewed By: vitalybuka

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

compiler-rt/lib/sanitizer_common/sanitizer_common_interceptors.inc

index 39b494e..7867fcc 100644 (file)
@@ -3357,7 +3357,7 @@ INTERCEPTOR(char *, setlocale, int category, char *locale) {
     COMMON_INTERCEPTOR_READ_RANGE(ctx, locale, REAL(strlen)(locale) + 1);
   char *res = REAL(setlocale)(category, locale);
   if (res) {
-    COMMON_INTERCEPTOR_WRITE_RANGE(ctx, res, REAL(strlen)(res) + 1);
+    COMMON_INTERCEPTOR_INITIALIZE_RANGE(res, REAL(strlen)(res) + 1);
     unpoison_ctype_arrays(ctx);
   }
   return res;