summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKostya Kortchinsky <kostyak@google.com>2017-11-27 21:34:43 +0000
committerKostya Kortchinsky <kostyak@google.com>2017-11-27 21:34:43 +0000
commit06b891f6939c5af46cb50c16f504932f1b448eff (patch)
tree53140ac36a32dea9a5db247cbdb27bec7f853f2d
parent2f20b36cc3dc5ef5709b09d22f6bbbcbe55456ae (diff)
downloadbcm5719-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.cpp12
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();
}
OpenPOWER on IntegriCloud