[compiler-rt] [compiler-rt] Fixed Android 8.1 `getauxval(AT_PAGESZ)` crashes if called from `.preinit_array`. (#113427) (PR #116121)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 13 05:06:02 PST 2024
https://github.com/funsafe-ptr updated https://github.com/llvm/llvm-project/pull/116121
>From 6ca5e0837ec84f789d27a2b296532e1cd8c45f86 Mon Sep 17 00:00:00 2001
From: funsafe-ptr <funsafe-ptr at proton.me>
Date: Wed, 13 Nov 2024 23:30:07 +0000
Subject: [PATCH 1/7] [compiler-rt] Fixed Android 8.1 `getauxval(AT_PAGESZ)`
crashes if called from `.preinit_array`. (#113427)
---
compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp | 11 +++++++++++
1 file changed, 11 insertions(+)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
index 8b1850f85010cf..3be26e785b9647 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
@@ -82,6 +82,11 @@
# include <sys/personality.h>
# endif
+# if SANITIZER_ANDROID && __ANDROID_API__ < 35
+// The weak strerrorname_np definition allows to check for the API level at runtime.
+extern "C" SANITIZER_WEAK_ATTRIBUTE const char* strerrorname_np(int);
+# endif
+
# if SANITIZER_LINUX && defined(__loongarch__)
# include <sys/sysmacros.h>
# endif
@@ -1214,6 +1219,12 @@ uptr GetPageSize() {
CHECK_EQ(rv, 0);
return (uptr)pz;
# elif SANITIZER_USE_GETAUXVAL
+
+# if SANITIZER_ANDROID && __ANDROID_API__ < 35
+ if (!strerrorname_np)
+ return 4096;
+# endif
+
return getauxval(AT_PAGESZ);
# else
return sysconf(_SC_PAGESIZE); // EXEC_PAGESIZE may not be trustworthy.
>From b1af6240851b191c6dea114c3934b1918e2b4c2f Mon Sep 17 00:00:00 2001
From: funsafe-ptr <funsafe-ptr at proton.me>
Date: Sat, 23 Nov 2024 00:01:13 +0000
Subject: [PATCH 2/7] [compiler-rt] Add Android page size comment and
formatting.
---
compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp | 6 ++++--
1 file changed, 4 insertions(+), 2 deletions(-)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
index 3be26e785b9647..cd67328498f3d2 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
@@ -83,7 +83,8 @@
# endif
# if SANITIZER_ANDROID && __ANDROID_API__ < 35
-// The weak strerrorname_np definition allows to check for the API level at runtime.
+// The weak strerrorname_np definition allows to check for the API level at
+// runtime.
extern "C" SANITIZER_WEAK_ATTRIBUTE const char* strerrorname_np(int);
# endif
@@ -1219,8 +1220,9 @@ uptr GetPageSize() {
CHECK_EQ(rv, 0);
return (uptr)pz;
# elif SANITIZER_USE_GETAUXVAL
-
# if SANITIZER_ANDROID && __ANDROID_API__ < 35
+ // The 16 KB page size was introduced in Android 15, while earlier versions
+ // of Android used a 4 KB page size.
if (!strerrorname_np)
return 4096;
# endif
>From 8997cc5134cff9bdb75a9fe99220d12fd200f644 Mon Sep 17 00:00:00 2001
From: funsafe-ptr <funsafe-ptr at proton.me>
Date: Sat, 23 Nov 2024 00:23:19 +0000
Subject: [PATCH 3/7] [compiler-rt] Fix formatting.
Signed-off-by: funsafe-ptr <funsafe-ptr at proton.me>
---
compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
index cd67328498f3d2..d7fbee297f20a1 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
@@ -82,11 +82,11 @@
# include <sys/personality.h>
# endif
-# if SANITIZER_ANDROID && __ANDROID_API__ < 35
+# if SANITIZER_ANDROID && __ANDROID_API__ < 35
// The weak strerrorname_np definition allows to check for the API level at
// runtime.
-extern "C" SANITIZER_WEAK_ATTRIBUTE const char* strerrorname_np(int);
-# endif
+extern "C" SANITIZER_WEAK_ATTRIBUTE const char *strerrorname_np(int);
+# endif
# if SANITIZER_LINUX && defined(__loongarch__)
# include <sys/sysmacros.h>
@@ -1221,7 +1221,7 @@ uptr GetPageSize() {
return (uptr)pz;
# elif SANITIZER_USE_GETAUXVAL
# if SANITIZER_ANDROID && __ANDROID_API__ < 35
- // The 16 KB page size was introduced in Android 15, while earlier versions
+ // The 16 KB page size was introduced in Android 15, while earlier versions
// of Android used a 4 KB page size.
if (!strerrorname_np)
return 4096;
>From b17a0474f47676ae1281c63175f3b45483a8f0bc Mon Sep 17 00:00:00 2001
From: funsafe-ptr <funsafe-ptr at proton.me>
Date: Sat, 23 Nov 2024 03:56:10 +0000
Subject: [PATCH 4/7] [compiler-rt] Fix comment.
---
compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
index d7fbee297f20a1..9be3faccdf53fa 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
@@ -83,8 +83,8 @@
# endif
# if SANITIZER_ANDROID && __ANDROID_API__ < 35
-// The weak strerrorname_np definition allows to check for the API level at
-// runtime.
+// The weak `strerrorname_np` (introduced in API level 35) definition,
+// allows for checking the API level at runtime.
extern "C" SANITIZER_WEAK_ATTRIBUTE const char *strerrorname_np(int);
# endif
@@ -1221,8 +1221,8 @@ uptr GetPageSize() {
return (uptr)pz;
# elif SANITIZER_USE_GETAUXVAL
# if SANITIZER_ANDROID && __ANDROID_API__ < 35
- // The 16 KB page size was introduced in Android 15, while earlier versions
- // of Android used a 4 KB page size.
+ // The 16 KB page size was introduced in Android 15 (API level 35), while
+ // earlier versions of Android always used a 4 KB page size.
if (!strerrorname_np)
return 4096;
# endif
>From 08d33873928638446b72f591b0c552c586d5bc0e Mon Sep 17 00:00:00 2001
From: funsafe-ptr <funsafe-ptr at proton.me>
Date: Sat, 30 Nov 2024 14:16:52 +0000
Subject: [PATCH 5/7] [compiler-rt] Add comment.
---
compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp | 3 +++
1 file changed, 3 insertions(+)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
index 9be3faccdf53fa..98050a341ffc3b 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
@@ -1223,6 +1223,9 @@ uptr GetPageSize() {
# if SANITIZER_ANDROID && __ANDROID_API__ < 35
// The 16 KB page size was introduced in Android 15 (API level 35), while
// earlier versions of Android always used a 4 KB page size.
+ // We are checking the weak definition of `strerrorname_np` (introduced in API
+ // level 35) because some earlier API levels crashed when
+ // `getauxval(AT_PAGESZ)` was called from the `.preinit_array`.
if (!strerrorname_np)
return 4096;
# endif
>From 771698b71e36268a2b37ea927f7a8657d19273e5 Mon Sep 17 00:00:00 2001
From: funsafe-ptr <funsafe-ptr at proton.me>
Date: Fri, 13 Dec 2024 00:24:57 +0000
Subject: [PATCH 6/7] [compiler-rt] Use `getpagesize` for Android.
---
.../lib/sanitizer_common/sanitizer_linux.cpp | 20 ++++---------------
1 file changed, 4 insertions(+), 16 deletions(-)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
index 98050a341ffc3b..1f3fb004185d2d 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
@@ -82,12 +82,6 @@
# include <sys/personality.h>
# endif
-# if SANITIZER_ANDROID && __ANDROID_API__ < 35
-// The weak `strerrorname_np` (introduced in API level 35) definition,
-// allows for checking the API level at runtime.
-extern "C" SANITIZER_WEAK_ATTRIBUTE const char *strerrorname_np(int);
-# endif
-
# if SANITIZER_LINUX && defined(__loongarch__)
# include <sys/sysmacros.h>
# endif
@@ -1219,17 +1213,11 @@ uptr GetPageSize() {
int rv = internal_sysctl(mib, 2, &pz, &pzl, nullptr, 0);
CHECK_EQ(rv, 0);
return (uptr)pz;
+# elif SANITIZER_ANDROID
+ // Using `getpagesize` because calling `getauxval` or `sysconf` from the
+ // `.preinit_array` can cause crashes on some older API levels.
+ return getpagesize();
# elif SANITIZER_USE_GETAUXVAL
-# if SANITIZER_ANDROID && __ANDROID_API__ < 35
- // The 16 KB page size was introduced in Android 15 (API level 35), while
- // earlier versions of Android always used a 4 KB page size.
- // We are checking the weak definition of `strerrorname_np` (introduced in API
- // level 35) because some earlier API levels crashed when
- // `getauxval(AT_PAGESZ)` was called from the `.preinit_array`.
- if (!strerrorname_np)
- return 4096;
-# endif
-
return getauxval(AT_PAGESZ);
# else
return sysconf(_SC_PAGESIZE); // EXEC_PAGESIZE may not be trustworthy.
>From 1837ce1998730e47fa90d28e3921e688816281c9 Mon Sep 17 00:00:00 2001
From: funsafe-ptr <funsafe-ptr at proton.me>
Date: Fri, 13 Dec 2024 13:04:45 +0000
Subject: [PATCH 7/7] Revert "[compiler-rt] Use `getpagesize` for Android."
This reverts commit 771698b71e36268a2b37ea927f7a8657d19273e5.
---
.../lib/sanitizer_common/sanitizer_linux.cpp | 20 +++++++++++++++----
1 file changed, 16 insertions(+), 4 deletions(-)
diff --git a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
index 1f3fb004185d2d..98050a341ffc3b 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_linux.cpp
@@ -82,6 +82,12 @@
# include <sys/personality.h>
# endif
+# if SANITIZER_ANDROID && __ANDROID_API__ < 35
+// The weak `strerrorname_np` (introduced in API level 35) definition,
+// allows for checking the API level at runtime.
+extern "C" SANITIZER_WEAK_ATTRIBUTE const char *strerrorname_np(int);
+# endif
+
# if SANITIZER_LINUX && defined(__loongarch__)
# include <sys/sysmacros.h>
# endif
@@ -1213,11 +1219,17 @@ uptr GetPageSize() {
int rv = internal_sysctl(mib, 2, &pz, &pzl, nullptr, 0);
CHECK_EQ(rv, 0);
return (uptr)pz;
-# elif SANITIZER_ANDROID
- // Using `getpagesize` because calling `getauxval` or `sysconf` from the
- // `.preinit_array` can cause crashes on some older API levels.
- return getpagesize();
# elif SANITIZER_USE_GETAUXVAL
+# if SANITIZER_ANDROID && __ANDROID_API__ < 35
+ // The 16 KB page size was introduced in Android 15 (API level 35), while
+ // earlier versions of Android always used a 4 KB page size.
+ // We are checking the weak definition of `strerrorname_np` (introduced in API
+ // level 35) because some earlier API levels crashed when
+ // `getauxval(AT_PAGESZ)` was called from the `.preinit_array`.
+ if (!strerrorname_np)
+ return 4096;
+# endif
+
return getauxval(AT_PAGESZ);
# else
return sysconf(_SC_PAGESIZE); // EXEC_PAGESIZE may not be trustworthy.
More information about the llvm-commits
mailing list