[ASan] Fix incompatible runtimes check: don't iterate /proc/self/maps on every call...
authorAlexey Samsonov <samsonov@google.com>
Wed, 2 Apr 2014 13:09:22 +0000 (13:09 +0000)
committerAlexey Samsonov <samsonov@google.com>
Wed, 2 Apr 2014 13:09:22 +0000 (13:09 +0000)
llvm-svn: 205418

compiler-rt/lib/asan/asan_linux.cc

index 8ad9de7..777cb43 100644 (file)
@@ -96,6 +96,11 @@ static bool IsDynamicRTName(const char *libname) {
     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