From 7d3f553f989f830976efa92ddc3c84661d4d42aa Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Tue, 7 Oct 2014 16:02:11 -0700 Subject: [PATCH] Work around a bug in Immersion's libImmEmulatorJ.so. This library calls pthread_mutex_lock and pthread_mutex_unlock with a NULL pthread_mutex_t*. This gives them (and their users) one release to fix things. Bug: 17443936 Change-Id: I3b63c9a3dd63db0833f21073e323b3236a13b47a --- libc/bionic/pthread_mutex.cpp | 12 ++++++++++++ libc/include/pthread.h | 4 ++-- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/libc/bionic/pthread_mutex.cpp b/libc/bionic/pthread_mutex.cpp index cbb6ef7a4..b338e516d 100644 --- a/libc/bionic/pthread_mutex.cpp +++ b/libc/bionic/pthread_mutex.cpp @@ -448,6 +448,12 @@ static inline __always_inline int _recursive_increment(pthread_mutex_t* mutex, i } int pthread_mutex_lock(pthread_mutex_t* mutex) { +#if !defined(__LP64__) + if (mutex == NULL) { + return EINVAL; + } +#endif + int mvalue, mtype, tid, shared; mvalue = mutex->value; @@ -526,6 +532,12 @@ int pthread_mutex_lock(pthread_mutex_t* mutex) { } int pthread_mutex_unlock(pthread_mutex_t* mutex) { +#if !defined(__LP64__) + if (mutex == NULL) { + return EINVAL; + } +#endif + int mvalue, mtype, tid, shared; mvalue = mutex->value; diff --git a/libc/include/pthread.h b/libc/include/pthread.h index 86a10051e..c32890b03 100644 --- a/libc/include/pthread.h +++ b/libc/include/pthread.h @@ -206,10 +206,10 @@ int pthread_mutexattr_settype(pthread_mutexattr_t*, int) __nonnull((1)); int pthread_mutex_destroy(pthread_mutex_t*) __nonnull((1)); int pthread_mutex_init(pthread_mutex_t*, const pthread_mutexattr_t*) __nonnull((1)); -int pthread_mutex_lock(pthread_mutex_t*) __nonnull((1)); +int pthread_mutex_lock(pthread_mutex_t*) /* __nonnull((1)) */; int pthread_mutex_timedlock(pthread_mutex_t*, const struct timespec*) __nonnull((1, 2)); int pthread_mutex_trylock(pthread_mutex_t*) __nonnull((1)); -int pthread_mutex_unlock(pthread_mutex_t*) __nonnull((1)); +int pthread_mutex_unlock(pthread_mutex_t*) /* __nonnull((1)) */; int pthread_once(pthread_once_t*, void (*)(void)) __nonnull((1, 2)); -- 2.11.0