Index: client/windows/handler/exception_handler.cc |
=================================================================== |
--- client/windows/handler/exception_handler.cc (revision 285) |
+++ client/windows/handler/exception_handler.cc (working copy) |
@@ -140,15 +140,22 @@ |
// context outside of an exception. |
InitializeCriticalSection(&handler_critical_section_); |
handler_start_semaphore_ = CreateSemaphore(NULL, 0, 1, NULL); |
+ assert(handler_start_semaphore_ != NULL); |
+ |
handler_finish_semaphore_ = CreateSemaphore(NULL, 0, 1, NULL); |
+ assert(handler_finish_semaphore_ != NULL); |
- DWORD thread_id; |
- handler_thread_ = CreateThread(NULL, // lpThreadAttributes |
- kExceptionHandlerThreadInitialStackSize, |
- ExceptionHandlerThreadMain, |
- this, // lpParameter |
- 0, // dwCreationFlags |
- &thread_id); |
+ // Don't attempt to create the thread if we could not create the semaphores. |
+ if (handler_finish_semaphore_ != NULL && handler_start_semaphore_ != NULL) { |
+ DWORD thread_id; |
+ handler_thread_ = CreateThread(NULL, // lpThreadAttributes |
+ kExceptionHandlerThreadInitialStackSize, |
+ ExceptionHandlerThreadMain, |
+ this, // lpParameter |
+ 0, // dwCreationFlags |
+ &thread_id); |
+ assert(handler_thread_ != NULL); |
+ } |
dbghelp_module_ = LoadLibrary(L"dbghelp.dll"); |
if (dbghelp_module_) { |
@@ -264,6 +271,8 @@ |
DWORD ExceptionHandler::ExceptionHandlerThreadMain(void* lpParameter) { |
ExceptionHandler* self = reinterpret_cast<ExceptionHandler *>(lpParameter); |
assert(self); |
+ assert(self->handler_start_semaphore_ != NULL); |
+ assert(self->handler_finish_semaphore_ != NULL); |
while (true) { |
if (WaitForSingleObject(self->handler_start_semaphore_, INFINITE) == |
@@ -519,6 +528,17 @@ |
EXCEPTION_POINTERS* exinfo, MDRawAssertionInfo* assertion) { |
EnterCriticalSection(&handler_critical_section_); |
+ // There isn't much we can do if the handler thread |
+ // was not successfully created. |
+ if (handler_thread_ == NULL) { |
+ LeaveCriticalSection(&handler_critical_section_); |
+ return false; |
+ } |
+ |
+ // The handler thread should only be created when the semaphores are valid. |
+ assert(handler_start_semaphore_ != NULL); |
+ assert(handler_finish_semaphore_ != NULL); |
+ |
// Set up data to be passed in to the handler thread. |
requesting_thread_id_ = GetCurrentThreadId(); |
exception_info_ = exinfo; |