ExceptionHandler class is not handling initialization errors, such as the
handler thread not being created. Protect the exception handler against failure to create semaphores and a thread handle. Patch by Marc-André (MAD) Decoste, r=me http://code.google.com/p/google-breakpad/issues/detail?id=285 http://codereview.chromium.org/13065 git-svn-id: http://google-breakpad.googlecode.com/svn/trunk@300 4c0a9323-5329-0410-9bdc-e9ce6186880e
This commit is contained in:
		@@ -140,15 +140,22 @@ void ExceptionHandler::Initialize(const wstring& dump_path,
 | 
			
		||||
    // context outside of an exception.
 | 
			
		||||
    InitializeCriticalSection(&handler_critical_section_);
 | 
			
		||||
    handler_start_semaphore_ = CreateSemaphore(NULL, 0, 1, NULL);
 | 
			
		||||
    handler_finish_semaphore_ = CreateSemaphore(NULL, 0, 1, NULL);
 | 
			
		||||
    assert(handler_start_semaphore_ != NULL);
 | 
			
		||||
 | 
			
		||||
    DWORD thread_id;
 | 
			
		||||
    handler_thread_ = CreateThread(NULL,         // lpThreadAttributes
 | 
			
		||||
                                   kExceptionHandlerThreadInitialStackSize,
 | 
			
		||||
                                   ExceptionHandlerThreadMain,
 | 
			
		||||
                                   this,         // lpParameter
 | 
			
		||||
                                   0,            // dwCreationFlags
 | 
			
		||||
                                   &thread_id);
 | 
			
		||||
    handler_finish_semaphore_ = CreateSemaphore(NULL, 0, 1, NULL);
 | 
			
		||||
    assert(handler_finish_semaphore_ != NULL);
 | 
			
		||||
 | 
			
		||||
    // 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 @@ ExceptionHandler::~ExceptionHandler() {
 | 
			
		||||
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 @@ bool ExceptionHandler::WriteMinidumpOnHandlerThread(
 | 
			
		||||
    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;
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user