Backport Tizen specific stuff from VDLinux 6.
authorIvan Baravy <i.baravy@samsung.com>
Mon, 27 Feb 2017 07:27:43 +0000 (10:27 +0300)
committerIvan Baravy <i.baravy@samsung.com>
Mon, 27 Feb 2017 07:27:43 +0000 (10:27 +0300)
    Backport from VDLinux 5. Optionally mount /proc in __asan_init to allow
    systemd sanitization.

        2014-10-21  Yury Gribov <y.gribov@samsung.com>

        JIRA: MAVDT-64

        * libsanitizer/asan/asan_rtl.cc (MaybeMountProcFS): New function.
        (__asan_init): Call MaybeMountProcFS.

    Mount /proc not only in AsanInitInternal, but also in __asan_init and AsanInitializer to
    ensure we have proc mounted when needed.

        * libsanitizer/asan/asan_rtl.cc (__asan_init): Call MaybeMountProcFS.
        * (AsanInitializer): Likewise.

    Set address space unlimited if it is not.

        * libsanitizer/asan/asan_rtl.cc (MaybeDisableUlimit): New function.
        (AsanInitInternal): Call it.

    Read ASan and UBSan options from predefined file if it is available.

        * libsanitizer/asan/asan_flags.cc: Read ASAN_OPTIONS from predefined
        file if available.
        * libsanitizer/ubsan/ubsan_flags.cc: Likewise.

libsanitizer/asan/asan_flags.cc
libsanitizer/asan/asan_rtl.cc
libsanitizer/ubsan/ubsan_flags.cc

index 9a68ad4..91d0917 100644 (file)
@@ -105,8 +105,21 @@ void InitializeFlags() {
   ubsan_parser.ParseString(ubsan_default_options);
 #endif
 
-  // Override from command line.
-  asan_parser.ParseString(GetEnv("ASAN_OPTIONS"));
+  // Read from command line.
+  const char *options = GetEnv("ASAN_OPTIONS");
+  // If environment variable ASAN_OPTIONS is not set use predefined file to
+  // init options.
+  bool getFlagsFromFile = options == 0;
+  char *asanFlags = 0;
+  uptr len = GetPageSizeCached();
+  uptr read_len = 0;
+  if (getFlagsFromFile) {
+    ReadFileToBuffer("/ASAN_OPTIONS", &asanFlags, &len, &read_len,
+                     GetPageSizeCached());
+    options = asanFlags;
+  }
+
+  asan_parser.ParseString(options);
 #if CAN_SANITIZE_LEAKS
   lsan_parser.ParseString(GetEnv("LSAN_OPTIONS"));
 #endif
@@ -165,6 +178,10 @@ void InitializeFlags() {
         (ASAN_LOW_MEMORY) ? 1UL << 6 : 1UL << 8;
     f->quarantine_size_mb = kDefaultQuarantineSizeMb;
   }
+
+  if (getFlagsFromFile)
+    UnmapOrDie(asanFlags, len);
+
 }
 
 }  // namespace __asan
index 50b0245..2b6287c 100644 (file)
@@ -26,6 +26,7 @@
 #include "sanitizer_common/sanitizer_flags.h"
 #include "sanitizer_common/sanitizer_libc.h"
 #include "sanitizer_common/sanitizer_symbolizer.h"
+#include "sanitizer_common/sanitizer_posix.h"
 #include "lsan/lsan_common.h"
 #include "ubsan/ubsan_init.h"
 #include "ubsan/ubsan_platform.h"
@@ -399,8 +400,32 @@ static void PrintAddressSpaceLayout() {
           kHighShadowBeg > kMidMemEnd);
 }
 
+extern "C"
+int mount(const char *source, const char *target, const char *filesystemtype,
+          unsigned long mountflags, const void *data);
+
+static void MaybeDisableUlimit() {
+  if (!AddressSpaceIsUnlimited())
+    SetAddressSpaceUnlimited();
+}
+
+bool MaybeMountProcFS() {
+  uptr tmp = OpenFile("/proc/self/maps", RdOnly);
+  if(!internal_iserror(tmp)) {
+    internal_close(tmp);
+    return true;
+  }
+  if(0 != mount("proc", "/proc", "proc", 0, 0)) {
+    Report("Failed to mount /proc, Asan is likely to fail\n");
+    return false;
+  }
+  return true;
+}
+
 static void AsanInitInternal() {
   if (LIKELY(asan_inited)) return;
+  MaybeMountProcFS();
+  MaybeDisableUlimit();
   SanitizerToolName = "AddressSanitizer";
   CHECK(!asan_init_is_running && "ASan init calls itself!");
   asan_init_is_running = true;
@@ -566,6 +591,7 @@ void AsanInitFromRtl() {
 class AsanInitializer {
 public:  // NOLINT
   AsanInitializer() {
+    MaybeMountProcFS();
     AsanInitFromRtl();
   }
 };
@@ -619,6 +645,7 @@ void NOINLINE __asan_set_death_callback(void (*callback)(void)) {
 // Initialize as requested from instrumented application code.
 // We use this call as a trigger to wake up ASan from deactivated state.
 void __asan_init() {
+  MaybeMountProcFS();
   AsanActivate();
   AsanInitInternal();
 }
index 4e7db7a..f3496d3 100644 (file)
@@ -55,8 +55,21 @@ void InitializeFlags() {
 
   // Override from user-specified string.
   parser.ParseString(MaybeCallUbsanDefaultOptions());
-  // Override from environment variable.
-  parser.ParseString(GetEnv("UBSAN_OPTIONS"));
+
+  // Read from command line.
+  const char *options = GetEnv("UBSAN_OPTIONS");
+  char *ubsanFlags = 0;
+  uptr len = GetPageSizeCached();
+  uptr read_len = 0;
+  bool getFlagsFromFile = ubsanFlags == 0;
+  // Override from predefined file if exists.
+  if (getFlagsFromFile) {
+    ReadFileToBuffer("/UBSAN_OPTIONS", &ubsanFlags, &len, &read_len,
+                     GetPageSizeCached());
+    options = ubsanFlags;
+  }
+  parser.ParseString(options);
+  UnmapOrDie(ubsanFlags, len);
   SetVerbosity(common_flags()->verbosity);
   if (Verbosity()) ReportUnrecognizedFlags();