summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRyan Prichard <rprichard@google.com>2021-06-07 15:51:38 -0700
committerRyan Prichard <rprichard@google.com>2021-06-07 16:07:55 -0700
commit45ad00158cee28182b7338b963e38b97747d7924 (patch)
treee6c7a1503de028c6373fce0790cef398ac7b5b3f
parent11d2f02ebc1727bbcdbc4df0a5c8966cdf9cbbb7 (diff)
downloadlibcxxabi-45ad00158cee28182b7338b963e38b97747d7924.tar.gz
cxa_guard: avoid sys/syscall.h and SYS_gettid
Avoid including sys/syscall.h on Android Trusty, because sys/syscall.h tries to include bits/syscall.h, which doesn't exist. Detect this situation using _LIBCXXABI_HAS_NO_THREADS, which Trust seems to define, and if there are no threads, then SYS_gettid isn't needed. Disable the SYS_gettid call for Bionic, because some Android processes have a seccomp filter blocking gettid. Bug: http://b/189279320 Test: treehugger Change-Id: I542d649d11f10f07ce702521f9d18736e67602c1
-rw-r--r--src/cxa_guard_impl.h10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/cxa_guard_impl.h b/src/cxa_guard_impl.h
index 58c5dc5..552c454 100644
--- a/src/cxa_guard_impl.h
+++ b/src/cxa_guard_impl.h
@@ -41,7 +41,10 @@
#include "include/atomic_support.h"
#include <unistd.h>
#include <sys/types.h>
-#if defined(__has_include)
+// Android Trusty: sys/syscall.h tries to include bits/syscall.h, which is
+// missing. Trusty seems to define _LIBCXXABI_HAS_NO_THREADS, and gettid isn't
+// needed in that case, so skip sys/syscall.h.
+#if defined(__has_include) && !defined(_LIBCXXABI_HAS_NO_THREADS)
# if __has_include(<sys/syscall.h>)
# include <sys/syscall.h>
# endif
@@ -113,7 +116,10 @@ uint32_t PlatformThreadID() {
return static_cast<uint32_t>(
pthread_mach_thread_np(std::__libcpp_thread_get_current_id()));
}
-#elif defined(SYS_gettid) && defined(_LIBCPP_HAS_THREAD_API_PTHREAD)
+#elif defined(SYS_gettid) && defined(_LIBCPP_HAS_THREAD_API_PTHREAD) && \
+ !defined(__BIONIC__)
+// Bionic: Disable the SYS_gettid feature for now. Some processes on Android
+// block SYS_gettid using seccomp.
uint32_t PlatformThreadID() {
static_assert(sizeof(pid_t) == sizeof(uint32_t), "");
return static_cast<uint32_t>(syscall(SYS_gettid));