diff options
| -rw-r--r-- | libc/bionic/pthread_mutex.cpp | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/libc/bionic/pthread_mutex.cpp b/libc/bionic/pthread_mutex.cpp index 6f1cf1367..478b31f8e 100644 --- a/libc/bionic/pthread_mutex.cpp +++ b/libc/bionic/pthread_mutex.cpp @@ -784,16 +784,21 @@ static int MutexLockWithTimeout(pthread_mutex_internal_t* mutex, bool use_realti } // namespace NonPI static inline __always_inline bool IsMutexDestroyed(uint16_t mutex_state) { - return mutex_state == 0xffff; + // Checking for mutex destruction is a P-specific behavior. Bypass the + // check if the SDK version precedes P, so that no change in behavior + // that may cause crashes is introduced. + if (android_get_application_target_sdk_version() >= __ANDROID_API_P__) { + return mutex_state == 0xffff; + } else { + return false; + } } // Inlining this function in pthread_mutex_lock() adds the cost of stack frame instructions on // ARM64. So make it noinline. static int __attribute__((noinline)) HandleUsingDestroyedMutex(pthread_mutex_t* mutex, const char* function_name) { - if (android_get_application_target_sdk_version() >= __ANDROID_API_P__) { - __fortify_fatal("%s called on a destroyed mutex (%p)", function_name, mutex); - } + __fortify_fatal("%s called on a destroyed mutex (%p)", function_name, mutex); return EBUSY; } |
