Commit 9f309b32 authored by Eric Pouech's avatar Eric Pouech Committed by Alexandre Julliard

msvcrt: Reset a signal to DFL before it's used.

parent 1f5e5a2b
...@@ -429,6 +429,7 @@ static const struct ...@@ -429,6 +429,7 @@ static const struct
static LONG WINAPI msvcrt_exception_filter(struct _EXCEPTION_POINTERS *except) static LONG WINAPI msvcrt_exception_filter(struct _EXCEPTION_POINTERS *except)
{ {
LONG ret = EXCEPTION_CONTINUE_SEARCH; LONG ret = EXCEPTION_CONTINUE_SEARCH;
MSVCRT___sighandler_t handler;
if (!except || !except->ExceptionRecord) if (!except || !except->ExceptionRecord)
return EXCEPTION_CONTINUE_SEARCH; return EXCEPTION_CONTINUE_SEARCH;
...@@ -436,10 +437,13 @@ static LONG WINAPI msvcrt_exception_filter(struct _EXCEPTION_POINTERS *except) ...@@ -436,10 +437,13 @@ static LONG WINAPI msvcrt_exception_filter(struct _EXCEPTION_POINTERS *except)
switch (except->ExceptionRecord->ExceptionCode) switch (except->ExceptionRecord->ExceptionCode)
{ {
case EXCEPTION_ACCESS_VIOLATION: case EXCEPTION_ACCESS_VIOLATION:
if (sighandlers[MSVCRT_SIGSEGV]) if ((handler = sighandlers[MSVCRT_SIGSEGV]) != MSVCRT_SIG_DFL)
{ {
if (sighandlers[MSVCRT_SIGSEGV] != MSVCRT_SIG_IGN) if (handler != MSVCRT_SIG_IGN)
sighandlers[MSVCRT_SIGSEGV](MSVCRT_SIGSEGV); {
sighandlers[MSVCRT_SIGSEGV] = MSVCRT_SIG_DFL;
handler(MSVCRT_SIGSEGV);
}
ret = EXCEPTION_CONTINUE_EXECUTION; ret = EXCEPTION_CONTINUE_EXECUTION;
} }
break; break;
...@@ -455,31 +459,36 @@ static LONG WINAPI msvcrt_exception_filter(struct _EXCEPTION_POINTERS *except) ...@@ -455,31 +459,36 @@ static LONG WINAPI msvcrt_exception_filter(struct _EXCEPTION_POINTERS *except)
case EXCEPTION_FLT_OVERFLOW: case EXCEPTION_FLT_OVERFLOW:
case EXCEPTION_FLT_STACK_CHECK: case EXCEPTION_FLT_STACK_CHECK:
case EXCEPTION_FLT_UNDERFLOW: case EXCEPTION_FLT_UNDERFLOW:
if (sighandlers[MSVCRT_SIGFPE]) if ((handler = sighandlers[MSVCRT_SIGFPE]) != MSVCRT_SIG_DFL)
{ {
if (sighandlers[MSVCRT_SIGFPE] != MSVCRT_SIG_IGN) if (handler != MSVCRT_SIG_IGN)
{ {
int i, float_signal = _FPE_INVALID; int i, float_signal = _FPE_INVALID;
float_handler handler = (float_handler)sighandlers[MSVCRT_SIGFPE]; sighandlers[MSVCRT_SIGFPE] = MSVCRT_SIG_DFL;
for (i = 0; i < sizeof(float_exception_map) / for (i = 0; i < sizeof(float_exception_map) /
sizeof(float_exception_map[0]); i++) sizeof(float_exception_map[0]); i++)
{
if (float_exception_map[i].status == if (float_exception_map[i].status ==
except->ExceptionRecord->ExceptionCode) except->ExceptionRecord->ExceptionCode)
{ {
float_signal = float_exception_map[i].signal; float_signal = float_exception_map[i].signal;
break; break;
} }
handler(MSVCRT_SIGFPE, float_signal); }
((float_handler)handler)(MSVCRT_SIGFPE, float_signal);
} }
ret = EXCEPTION_CONTINUE_EXECUTION; ret = EXCEPTION_CONTINUE_EXECUTION;
} }
break; break;
case EXCEPTION_ILLEGAL_INSTRUCTION: case EXCEPTION_ILLEGAL_INSTRUCTION:
if (sighandlers[MSVCRT_SIGILL]) if ((handler = sighandlers[MSVCRT_SIGILL]) != MSVCRT_SIG_DFL)
{ {
if (sighandlers[MSVCRT_SIGILL] != MSVCRT_SIG_IGN) if (handler != MSVCRT_SIG_IGN)
sighandlers[MSVCRT_SIGILL](MSVCRT_SIGILL); {
sighandlers[MSVCRT_SIGILL] = MSVCRT_SIG_DFL;
handler(MSVCRT_SIGILL);
}
ret = EXCEPTION_CONTINUE_EXECUTION; ret = EXCEPTION_CONTINUE_EXECUTION;
} }
break; break;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment