[compiler-rt] r205418 - [ASan] Fix incompatible runtimes check: don't iterate /proc/self/maps on every call to __asan_init

Alexey Samsonov samsonov at google.com
Wed Apr 2 06:09:23 PDT 2014


Author: samsonov
Date: Wed Apr  2 08:09:22 2014
New Revision: 205418

URL: http://llvm.org/viewvc/llvm-project?rev=205418&view=rev
Log:
[ASan] Fix incompatible runtimes check: don't iterate /proc/self/maps on every call to __asan_init

Modified:
    compiler-rt/trunk/lib/asan/asan_linux.cc

Modified: compiler-rt/trunk/lib/asan/asan_linux.cc
URL: http://llvm.org/viewvc/llvm-project/compiler-rt/trunk/lib/asan/asan_linux.cc?rev=205418&r1=205417&r2=205418&view=diff
==============================================================================
--- compiler-rt/trunk/lib/asan/asan_linux.cc (original)
+++ compiler-rt/trunk/lib/asan/asan_linux.cc Wed Apr  2 08:09:22 2014
@@ -96,6 +96,11 @@ static bool IsDynamicRTName(const char *
     internal_strstr(libname, "libasan.so");
 }
 
+static void ReportIncompatibleRT() {
+  Report("Your application is linked against incompatible ASan runtimes.\n");
+  Die();
+}
+
 void AsanCheckDynamicRTPrereqs() {
   // Ensure that dynamic RT is the first DSO in the list
   const char *first_dso_name = 0;
@@ -113,27 +118,27 @@ void AsanCheckIncompatibleRT() {
     if (__asan_rt_version == ASAN_RT_VERSION_UNDEFINED) {
       __asan_rt_version = ASAN_RT_VERSION_DYNAMIC;
     } else if (__asan_rt_version != ASAN_RT_VERSION_DYNAMIC) {
-      Report("Your application is linked against "
-             "incompatible ASan runtimes.\n");
-      Die();
+      ReportIncompatibleRT();
     }
   } else {
-    // Ensure that dynamic runtime is not present. We should detect it
-    // as early as possible, otherwise ASan interceptors could bind to
-    // the functions in dynamic ASan runtime instead of the functions in
-    // system libraries, causing crashes later in ASan initialization.
-    MemoryMappingLayout proc_maps(/*cache_enabled*/true);
-    char filename[128];
-    while (proc_maps.Next(0, 0, 0, filename, sizeof(filename), 0)) {
-      if (IsDynamicRTName(filename)) {
-        Report("Your application is linked against "
-               "incompatible ASan runtimes.\n");
-        Die();
+    if (__asan_rt_version == ASAN_RT_VERSION_UNDEFINED) {
+      // Ensure that dynamic runtime is not present. We should detect it
+      // as early as possible, otherwise ASan interceptors could bind to
+      // the functions in dynamic ASan runtime instead of the functions in
+      // system libraries, causing crashes later in ASan initialization.
+      MemoryMappingLayout proc_maps(/*cache_enabled*/true);
+      char filename[128];
+      while (proc_maps.Next(0, 0, 0, filename, sizeof(filename), 0)) {
+        if (IsDynamicRTName(filename)) {
+          Report("Your application is linked against "
+                 "incompatible ASan runtimes.\n");
+          Die();
+        }
       }
+      __asan_rt_version = ASAN_RT_VERSION_STATIC;
+    } else if (__asan_rt_version != ASAN_RT_VERSION_STATIC) {
+      ReportIncompatibleRT();
     }
-
-    CHECK_NE(__asan_rt_version, ASAN_RT_VERSION_DYNAMIC);
-    __asan_rt_version = ASAN_RT_VERSION_STATIC;
   }
 }
 #endif  // SANITIZER_ANDROID





More information about the llvm-commits mailing list