Fixed sign extension bug in EH_prolog, and made trylevel an int to
avoid similar problems.
This commit is contained in:
parent
f8da8541eb
commit
d78b458ed1
@ -46,7 +46,7 @@ typedef void (*MSVCRT_sig_handler_func)(void);
|
|||||||
/* VC++ extensions to Win32 SEH */
|
/* VC++ extensions to Win32 SEH */
|
||||||
typedef struct _SCOPETABLE
|
typedef struct _SCOPETABLE
|
||||||
{
|
{
|
||||||
DWORD previousTryLevel;
|
int previousTryLevel;
|
||||||
int (*lpfnFilter)(PEXCEPTION_POINTERS);
|
int (*lpfnFilter)(PEXCEPTION_POINTERS);
|
||||||
int (*lpfnHandler)(void);
|
int (*lpfnHandler)(void);
|
||||||
} SCOPETABLE, *PSCOPETABLE;
|
} SCOPETABLE, *PSCOPETABLE;
|
||||||
@ -57,12 +57,12 @@ typedef struct _MSVCRT_EXCEPTION_FRAME
|
|||||||
void (*handler)(PEXCEPTION_RECORD, PEXCEPTION_FRAME,
|
void (*handler)(PEXCEPTION_RECORD, PEXCEPTION_FRAME,
|
||||||
PCONTEXT, PEXCEPTION_RECORD);
|
PCONTEXT, PEXCEPTION_RECORD);
|
||||||
PSCOPETABLE scopetable;
|
PSCOPETABLE scopetable;
|
||||||
DWORD trylevel;
|
int trylevel;
|
||||||
int _ebp;
|
int _ebp;
|
||||||
PEXCEPTION_POINTERS xpointers;
|
PEXCEPTION_POINTERS xpointers;
|
||||||
} MSVCRT_EXCEPTION_FRAME;
|
} MSVCRT_EXCEPTION_FRAME;
|
||||||
|
|
||||||
#define TRYLEVEL_END 0xffffffff /* End of trylevel list */
|
#define TRYLEVEL_END (-1) /* End of trylevel list */
|
||||||
|
|
||||||
#if defined(__GNUC__) && defined(__i386__)
|
#if defined(__GNUC__) && defined(__i386__)
|
||||||
inline static void call_finally_block( void *code_block, void *base_ptr )
|
inline static void call_finally_block( void *code_block, void *base_ptr )
|
||||||
@ -107,7 +107,7 @@ int _XcptFilter(int ex, PEXCEPTION_POINTERS ptr)
|
|||||||
#ifdef __i386__
|
#ifdef __i386__
|
||||||
/* Provided for VC++ binary compatability only */
|
/* Provided for VC++ binary compatability only */
|
||||||
__ASM_GLOBAL_FUNC(_EH_prolog,
|
__ASM_GLOBAL_FUNC(_EH_prolog,
|
||||||
"pushl $0xff\n\t"
|
"pushl $-1\n\t"
|
||||||
"pushl %eax\n\t"
|
"pushl %eax\n\t"
|
||||||
"pushl %fs:0\n\t"
|
"pushl %fs:0\n\t"
|
||||||
"movl %esp, %fs:0\n\t"
|
"movl %esp, %fs:0\n\t"
|
||||||
@ -130,14 +130,12 @@ void _global_unwind2(PEXCEPTION_FRAME frame)
|
|||||||
/*******************************************************************
|
/*******************************************************************
|
||||||
* _local_unwind2 (MSVCRT.@)
|
* _local_unwind2 (MSVCRT.@)
|
||||||
*/
|
*/
|
||||||
void _local_unwind2(MSVCRT_EXCEPTION_FRAME* frame,
|
void _local_unwind2(MSVCRT_EXCEPTION_FRAME* frame, int trylevel)
|
||||||
DWORD trylevel)
|
|
||||||
{
|
{
|
||||||
MSVCRT_EXCEPTION_FRAME *curframe = frame;
|
MSVCRT_EXCEPTION_FRAME *curframe = frame;
|
||||||
DWORD curtrylevel = 0xfe;
|
|
||||||
EXCEPTION_FRAME reg;
|
EXCEPTION_FRAME reg;
|
||||||
|
|
||||||
TRACE("(%p,%ld,%ld)\n",frame, frame->trylevel, trylevel);
|
TRACE("(%p,%d,%d)\n",frame, frame->trylevel, trylevel);
|
||||||
|
|
||||||
/* Register a handler in case of a nested exception */
|
/* Register a handler in case of a nested exception */
|
||||||
reg.Handler = (PEXCEPTION_HANDLER)MSVCRT_nested_handler;
|
reg.Handler = (PEXCEPTION_HANDLER)MSVCRT_nested_handler;
|
||||||
@ -146,7 +144,7 @@ void _local_unwind2(MSVCRT_EXCEPTION_FRAME* frame,
|
|||||||
|
|
||||||
while (frame->trylevel != TRYLEVEL_END && frame->trylevel != trylevel)
|
while (frame->trylevel != TRYLEVEL_END && frame->trylevel != trylevel)
|
||||||
{
|
{
|
||||||
curtrylevel = frame->scopetable[frame->trylevel].previousTryLevel;
|
int curtrylevel = frame->scopetable[frame->trylevel].previousTryLevel;
|
||||||
curframe = frame;
|
curframe = frame;
|
||||||
curframe->trylevel = curtrylevel;
|
curframe->trylevel = curtrylevel;
|
||||||
if (!frame->scopetable[curtrylevel].lpfnFilter)
|
if (!frame->scopetable[curtrylevel].lpfnFilter)
|
||||||
@ -183,7 +181,8 @@ int _except_handler3(PEXCEPTION_RECORD rec,
|
|||||||
PCONTEXT context, void* dispatcher)
|
PCONTEXT context, void* dispatcher)
|
||||||
{
|
{
|
||||||
#if defined(__GNUC__) && defined(__i386__)
|
#if defined(__GNUC__) && defined(__i386__)
|
||||||
long retval, trylevel;
|
long retval;
|
||||||
|
int trylevel;
|
||||||
EXCEPTION_POINTERS exceptPtrs;
|
EXCEPTION_POINTERS exceptPtrs;
|
||||||
PSCOPETABLE pScopeTable;
|
PSCOPETABLE pScopeTable;
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user