fix crash handler for stack overflwos
This commit is contained in:
@@ -264,7 +264,7 @@ void RunChild()
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
long __stdcall CrashHandler::ExceptionHandler( EXCEPTION_POINTERS *pExc )
|
static long MainExceptionHandler( EXCEPTION_POINTERS *pExc )
|
||||||
{
|
{
|
||||||
/* Flush the log it isn't cut off at the end. */
|
/* Flush the log it isn't cut off at the end. */
|
||||||
/* 1. We can't do regular file access in the crash handler.
|
/* 1. We can't do regular file access in the crash handler.
|
||||||
@@ -321,7 +321,7 @@ long __stdcall CrashHandler::ExceptionHandler( EXCEPTION_POINTERS *pExc )
|
|||||||
|
|
||||||
if( !g_CrashInfo.m_CrashReason[0] )
|
if( !g_CrashInfo.m_CrashReason[0] )
|
||||||
GetReason( pExc->ExceptionRecord, &g_CrashInfo );
|
GetReason( pExc->ExceptionRecord, &g_CrashInfo );
|
||||||
do_backtrace( g_CrashInfo.m_BacktracePointers, BACKTRACE_MAX_SIZE, GetCurrentProcess(), GetCurrentThread(), pExc->ContextRecord );
|
CrashHandler::do_backtrace( g_CrashInfo.m_BacktracePointers, BACKTRACE_MAX_SIZE, GetCurrentProcess(), GetCurrentThread(), pExc->ContextRecord );
|
||||||
|
|
||||||
RunChild();
|
RunChild();
|
||||||
|
|
||||||
@@ -356,6 +356,18 @@ long __stdcall CrashHandler::ExceptionHandler( EXCEPTION_POINTERS *pExc )
|
|||||||
return EXCEPTION_EXECUTE_HANDLER;
|
return EXCEPTION_EXECUTE_HANDLER;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
long __stdcall CrashHandler::ExceptionHandler( EXCEPTION_POINTERS *pExc )
|
||||||
|
{
|
||||||
|
/* If the stack overflowed, we have a very limited amount of stack space. Allocate
|
||||||
|
* a new stack, and run the exception handler in it, to increase the chances of success. */
|
||||||
|
int iSize = 1024*32;
|
||||||
|
char *pStack = (char *) VirtualAlloc( NULL, iSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE );
|
||||||
|
pStack += iSize;
|
||||||
|
_asm mov esp, pStack;
|
||||||
|
|
||||||
|
return MainExceptionHandler( pExc );
|
||||||
|
}
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
static bool IsValidCall(char *buf, int len)
|
static bool IsValidCall(char *buf, int len)
|
||||||
|
|||||||
Reference in New Issue
Block a user