Fixed crash if mutex functions are used before any mutex has been created

(cherry picked from commit cc49f1e279b7ef0edf30d8eeaee9e05fd079bf82)
This commit is contained in:
Sam Lantinga 2022-12-26 09:49:36 -08:00
parent f75c0e3204
commit 488a91eb40

View file

@ -71,10 +71,8 @@ static SDL_mutex *SDL_CreateMutex_srw(void)
static void SDL_DestroyMutex_srw(SDL_mutex *mutex) static void SDL_DestroyMutex_srw(SDL_mutex *mutex)
{ {
if (mutex != NULL) { /* There are no kernel allocated resources */
/* There are no kernel allocated resources */ SDL_free(mutex);
SDL_free(mutex);
}
} }
static int SDL_LockMutex_srw(SDL_mutex *_mutex) SDL_NO_THREAD_SAFETY_ANALYSIS /* clang doesn't know about NULL mutexes */ static int SDL_LockMutex_srw(SDL_mutex *_mutex) SDL_NO_THREAD_SAFETY_ANALYSIS /* clang doesn't know about NULL mutexes */
@ -82,10 +80,6 @@ static int SDL_LockMutex_srw(SDL_mutex *_mutex) SDL_NO_THREAD_SAFETY_ANALYSIS /*
SDL_mutex_srw *mutex = (SDL_mutex_srw *)_mutex; SDL_mutex_srw *mutex = (SDL_mutex_srw *)_mutex;
DWORD this_thread; DWORD this_thread;
if (mutex == NULL) {
return 0;
}
this_thread = GetCurrentThreadId(); this_thread = GetCurrentThreadId();
if (mutex->owner == this_thread) { if (mutex->owner == this_thread) {
++mutex->count; ++mutex->count;
@ -108,10 +102,6 @@ static int SDL_TryLockMutex_srw(SDL_mutex *_mutex)
DWORD this_thread; DWORD this_thread;
int retval = 0; int retval = 0;
if (mutex == NULL) {
return 0;
}
this_thread = GetCurrentThreadId(); this_thread = GetCurrentThreadId();
if (mutex->owner == this_thread) { if (mutex->owner == this_thread) {
++mutex->count; ++mutex->count;
@ -131,10 +121,6 @@ static int SDL_UnlockMutex_srw(SDL_mutex *_mutex) SDL_NO_THREAD_SAFETY_ANALYSIS
{ {
SDL_mutex_srw *mutex = (SDL_mutex_srw *)_mutex; SDL_mutex_srw *mutex = (SDL_mutex_srw *)_mutex;
if (mutex == NULL) {
return 0;
}
if (mutex->owner == GetCurrentThreadId()) { if (mutex->owner == GetCurrentThreadId()) {
if (--mutex->count == 0) { if (--mutex->count == 0) {
mutex->owner = 0; mutex->owner = 0;
@ -185,19 +171,15 @@ static SDL_mutex *SDL_CreateMutex_cs(void)
static void SDL_DestroyMutex_cs(SDL_mutex *mutex_) static void SDL_DestroyMutex_cs(SDL_mutex *mutex_)
{ {
SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_; SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_;
if (mutex != NULL) {
DeleteCriticalSection(&mutex->cs); DeleteCriticalSection(&mutex->cs);
SDL_free(mutex); SDL_free(mutex);
}
} }
/* Lock the mutex */ /* Lock the mutex */
static int SDL_LockMutex_cs(SDL_mutex *mutex_) SDL_NO_THREAD_SAFETY_ANALYSIS /* clang doesn't know about NULL mutexes */ static int SDL_LockMutex_cs(SDL_mutex *mutex_) SDL_NO_THREAD_SAFETY_ANALYSIS /* clang doesn't know about NULL mutexes */
{ {
SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_; SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_;
if (mutex == NULL) {
return 0;
}
EnterCriticalSection(&mutex->cs); EnterCriticalSection(&mutex->cs);
return 0; return 0;
@ -208,9 +190,6 @@ static int SDL_TryLockMutex_cs(SDL_mutex *mutex_)
{ {
SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_; SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_;
int retval = 0; int retval = 0;
if (mutex == NULL) {
return 0;
}
if (TryEnterCriticalSection(&mutex->cs) == 0) { if (TryEnterCriticalSection(&mutex->cs) == 0) {
retval = SDL_MUTEX_TIMEDOUT; retval = SDL_MUTEX_TIMEDOUT;
@ -222,9 +201,6 @@ static int SDL_TryLockMutex_cs(SDL_mutex *mutex_)
static int SDL_UnlockMutex_cs(SDL_mutex *mutex_) SDL_NO_THREAD_SAFETY_ANALYSIS /* clang doesn't know about NULL mutexes */ static int SDL_UnlockMutex_cs(SDL_mutex *mutex_) SDL_NO_THREAD_SAFETY_ANALYSIS /* clang doesn't know about NULL mutexes */
{ {
SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_; SDL_mutex_cs *mutex = (SDL_mutex_cs *)mutex_;
if (mutex == NULL) {
return 0;
}
LeaveCriticalSection(&mutex->cs); LeaveCriticalSection(&mutex->cs);
return 0; return 0;
@ -277,21 +253,35 @@ SDL_mutex *SDL_CreateMutex(void)
void SDL_DestroyMutex(SDL_mutex *mutex) void SDL_DestroyMutex(SDL_mutex *mutex)
{ {
SDL_mutex_impl_active.Destroy(mutex); if (mutex) {
SDL_mutex_impl_active.Destroy(mutex);
}
} }
int SDL_LockMutex(SDL_mutex *mutex) int SDL_LockMutex(SDL_mutex *mutex)
{ {
if (mutex == NULL) {
return 0;
}
return SDL_mutex_impl_active.Lock(mutex); return SDL_mutex_impl_active.Lock(mutex);
} }
int SDL_TryLockMutex(SDL_mutex *mutex) int SDL_TryLockMutex(SDL_mutex *mutex)
{ {
if (mutex == NULL) {
return 0;
}
return SDL_mutex_impl_active.TryLock(mutex); return SDL_mutex_impl_active.TryLock(mutex);
} }
int SDL_UnlockMutex(SDL_mutex *mutex) int SDL_UnlockMutex(SDL_mutex *mutex)
{ {
if (mutex == NULL) {
return 0;
}
return SDL_mutex_impl_active.Unlock(mutex); return SDL_mutex_impl_active.Unlock(mutex);
} }