Fix unchecked CreateMutex calls

This commit is contained in:
Norbert Federa 2015-05-05 17:25:17 +02:00
parent 063c1bc806
commit c77def3048
4 changed files with 30 additions and 13 deletions

View File

@ -142,11 +142,14 @@ int wf_rdpsnd_unlock()
BOOL wf_peer_rdpsnd_init(wfPeerContext* context)
{
wfInfo* wfi;
wfInfo* wfi = wf_info_get_instance();
wfi = wf_info_get_instance();
if (!wfi)
return FALSE;
if (!(wfi->snd_mutex = CreateMutex(NULL, FALSE, NULL)))
return FALSE;
wfi->snd_mutex = CreateMutex(NULL, FALSE, NULL);
context->rdpsnd = rdpsnd_server_context_new(context->vcm);
context->rdpsnd->data = context;

View File

@ -253,31 +253,36 @@ PVOID InterlockedCompareExchangePointer(PVOID volatile *Destination, PVOID Excha
static volatile HANDLE mutex = NULL;
int static_mutex_lock(volatile HANDLE* static_mutex)
BOOL static_mutex_lock(volatile HANDLE* static_mutex)
{
if (*static_mutex == NULL)
{
HANDLE handle = CreateMutex(NULL, FALSE, NULL);
HANDLE handle;
if (!(handle = CreateMutex(NULL, FALSE, NULL)))
return FALSE;
if (InterlockedCompareExchangePointer((PVOID*) static_mutex, (PVOID) handle, NULL) != NULL)
CloseHandle(handle);
}
return (WaitForSingleObject(*static_mutex, INFINITE) == WAIT_FAILED);
return (WaitForSingleObject(*static_mutex, INFINITE) == WAIT_OBJECT_0);
}
LONGLONG InterlockedCompareExchange64(LONGLONG volatile *Destination, LONGLONG Exchange, LONGLONG Comperand)
{
LONGLONG previousValue = 0;
static_mutex_lock(&mutex);
BOOL locked = static_mutex_lock(&mutex);
previousValue = *Destination;
if (*Destination == Comperand)
*Destination = Exchange;
ReleaseMutex(mutex);
if (locked)
ReleaseMutex(mutex);
else
fprintf(stderr, "WARNING: InterlockedCompareExchange64 operation might have failed\n");
return previousValue;
}

View File

@ -55,6 +55,12 @@ int TestThreadCreateProcess(int argc, char* argv[])
&StartupInfo,
&ProcessInformation);
if (!status)
{
printf("CreateProcess failed. error=%d\n", GetLastError());
return 1;
}
FreeEnvironmentStrings(lpszEnvironmentBlock);
WaitForSingleObject(ProcessInformation.hProcess, INFINITE);

View File

@ -60,12 +60,15 @@ static void _winpr_openssl_locking(int mode, int type, const char* file, int lin
static struct CRYPTO_dynlock_value* _winpr_openssl_dynlock_create(const char* file, int line)
{
struct CRYPTO_dynlock_value* dynlock = (struct CRYPTO_dynlock_value*)
malloc(sizeof(struct CRYPTO_dynlock_value));
struct CRYPTO_dynlock_value* dynlock;
if (dynlock)
if (!(dynlock = (struct CRYPTO_dynlock_value*) malloc(sizeof(struct CRYPTO_dynlock_value))))
return NULL;
if (!(dynlock->mutex = CreateMutex(NULL, FALSE, NULL)))
{
dynlock->mutex = CreateMutex(NULL, FALSE, NULL);
free(dynlock);
return NULL;
}
return dynlock;