diff options
| author | Kostya Kortchinsky <kostyak@google.com> | 2017-11-27 21:34:43 +0000 | 
|---|---|---|
| committer | Kostya Kortchinsky <kostyak@google.com> | 2017-11-27 21:34:43 +0000 | 
| commit | 06b891f6939c5af46cb50c16f504932f1b448eff (patch) | |
| tree | 53140ac36a32dea9a5db247cbdb27bec7f853f2d | |
| parent | 2f20b36cc3dc5ef5709b09d22f6bbbcbe55456ae (diff) | |
| download | bcm5719-llvm-06b891f6939c5af46cb50c16f504932f1b448eff.tar.gz bcm5719-llvm-06b891f6939c5af46cb50c16f504932f1b448eff.zip | |
[scudo] Workaround for uninitialized Bionic globals
Summary:
Bionic doesn't initialize its globals early enough. This causes issues when
trying to access them from a preinit_array (b/25751302) or from another
constructor called before the libc one (b/68046352). __progname is initialized
after the other globals, so we can check its value to know if calling
`getauxval` is safe.
Reviewers: alekseyshl
Reviewed By: alekseyshl
Subscribers: srhines, llvm-commits
Differential Revision: https://reviews.llvm.org/D40504
llvm-svn: 319099
| -rw-r--r-- | compiler-rt/lib/scudo/scudo_utils.cpp | 12 | 
1 files changed, 11 insertions, 1 deletions
| diff --git a/compiler-rt/lib/scudo/scudo_utils.cpp b/compiler-rt/lib/scudo/scudo_utils.cpp index 75be2fc73ec..2f936bf9e78 100644 --- a/compiler-rt/lib/scudo/scudo_utils.cpp +++ b/compiler-rt/lib/scudo/scudo_utils.cpp @@ -96,8 +96,18 @@ bool hasHardwareCRC32ARMPosix() {  bool hasHardwareCRC32ARMPosix() { return false; }  # endif  // SANITIZER_POSIX +// Bionic doesn't initialize its globals early enough. This causes issues when +// trying to access them from a preinit_array (b/25751302) or from another +// constructor called before the libc one (b/68046352). __progname is +// initialized after the other globals, so we can check its value to know if +// calling getauxval is safe. +extern "C" SANITIZER_WEAK_ATTRIBUTE char *__progname; +INLINE bool areBionicGlobalsInitialized() { +  return !SANITIZER_ANDROID || (&__progname && __progname); +} +  bool hasHardwareCRC32() { -  if (&getauxval) +  if (&getauxval && areBionicGlobalsInitialized())      return !!(getauxval(AT_HWCAP) & HWCAP_CRC32);    return hasHardwareCRC32ARMPosix();  } | 

