diff options
| author | Alexey Samsonov <samsonov@google.com> | 2014-04-02 13:09:22 +0000 |
|---|---|---|
| committer | Alexey Samsonov <samsonov@google.com> | 2014-04-02 13:09:22 +0000 |
| commit | 11ff0a26a48af41db54e058cae44ca85fb7551bc (patch) | |
| tree | 0a5f414f9ae705c25557619785f46c5190e92f42 /compiler-rt | |
| parent | 6cc687541fde6d7f451ca233104311e3ab2931d9 (diff) | |
| download | bcm5719-llvm-11ff0a26a48af41db54e058cae44ca85fb7551bc.tar.gz bcm5719-llvm-11ff0a26a48af41db54e058cae44ca85fb7551bc.zip | |
[ASan] Fix incompatible runtimes check: don't iterate /proc/self/maps on every call to __asan_init
llvm-svn: 205418
Diffstat (limited to 'compiler-rt')
| -rw-r--r-- | compiler-rt/lib/asan/asan_linux.cc | 39 |
1 files changed, 22 insertions, 17 deletions
diff --git a/compiler-rt/lib/asan/asan_linux.cc b/compiler-rt/lib/asan/asan_linux.cc index 8ad9de781a4..777cb43bfa2 100644 --- a/compiler-rt/lib/asan/asan_linux.cc +++ b/compiler-rt/lib/asan/asan_linux.cc @@ -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 |

