1
0
forked from 0ad/0ad

paranoid error checking of pthread mutex functions (safely fails use-after-free requests)

fixes a crash at shutdown after a client has connected

This was SVN commit r5788.
This commit is contained in:
janwas 2008-03-25 21:20:43 +00:00
parent 1aa514a6ef
commit bc999e00d7

View File

@ -234,6 +234,16 @@ again:
// note: we use win_alloc instead of new because the (no longer extant)
// memory manager used a pthread_mutex.
static CRITICAL_SECTION* CRITICAL_SECTION_from_pthread_mutex_t(pthread_mutex_t* m)
{
if(!m)
{
debug_assert(0);
return 0;
}
return (CRITICAL_SECTION*)*m;
}
pthread_mutex_t pthread_mutex_initializer()
{
CRITICAL_SECTION* cs = (CRITICAL_SECTION*)win_alloc(sizeof(CRITICAL_SECTION));
@ -243,9 +253,12 @@ pthread_mutex_t pthread_mutex_initializer()
int pthread_mutex_destroy(pthread_mutex_t* m)
{
CRITICAL_SECTION* cs = (CRITICAL_SECTION*)(*m);
CRITICAL_SECTION* cs = CRITICAL_SECTION_from_pthread_mutex_t(m);
if(!cs)
return -1;
DeleteCriticalSection(cs);
win_free(cs);
*m = 0; // cause double-frees to be noticed
return 0;
}
@ -257,21 +270,27 @@ int pthread_mutex_init(pthread_mutex_t* m, const pthread_mutexattr_t*)
int pthread_mutex_lock(pthread_mutex_t* m)
{
CRITICAL_SECTION* cs = (CRITICAL_SECTION*)(*m);
CRITICAL_SECTION* cs = CRITICAL_SECTION_from_pthread_mutex_t(m);
if(!cs)
return -1;
EnterCriticalSection(cs);
return 0;
}
int pthread_mutex_trylock(pthread_mutex_t* m)
{
CRITICAL_SECTION* cs = (CRITICAL_SECTION*)(*m);
BOOL got_it = TryEnterCriticalSection(cs);
return got_it? 0 : -1;
CRITICAL_SECTION* cs = CRITICAL_SECTION_from_pthread_mutex_t(m);
if(!cs)
return -1;
const BOOL successfullyEnteredOrAlreadyOwns = TryEnterCriticalSection(cs);
return successfullyEnteredOrAlreadyOwns? 0 : -1;
}
int pthread_mutex_unlock(pthread_mutex_t* m)
{
CRITICAL_SECTION* cs = (CRITICAL_SECTION*)(*m);
CRITICAL_SECTION* cs = CRITICAL_SECTION_from_pthread_mutex_t(m);
if(!cs)
return -1;
LeaveCriticalSection(cs);
return 0;
}