ntdll: Remap EXCEPTION_EXECUTE_FAULT only after the internal handlers have been run.
This commit is contained in:
parent
4fe014cb54
commit
9585bf6700
|
@ -1657,6 +1657,15 @@ static void WINAPI raise_segv_exception( EXCEPTION_RECORD *rec, CONTEXT *context
|
||||||
if (!(rec->ExceptionCode = virtual_handle_fault( (void *)rec->ExceptionInformation[1],
|
if (!(rec->ExceptionCode = virtual_handle_fault( (void *)rec->ExceptionInformation[1],
|
||||||
rec->ExceptionInformation[0] )))
|
rec->ExceptionInformation[0] )))
|
||||||
goto done;
|
goto done;
|
||||||
|
/* send EXCEPTION_EXECUTE_FAULT only if data execution prevention is enabled */
|
||||||
|
if (rec->ExceptionInformation[0] == EXCEPTION_EXECUTE_FAULT)
|
||||||
|
{
|
||||||
|
ULONG flags;
|
||||||
|
NtQueryInformationProcess( GetCurrentProcess(), ProcessExecuteFlags,
|
||||||
|
&flags, sizeof(flags), NULL );
|
||||||
|
if (!(flags & MEM_EXECUTE_OPTION_DISABLE))
|
||||||
|
rec->ExceptionInformation[0] = EXCEPTION_READ_FAULT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case EXCEPTION_DATATYPE_MISALIGNMENT:
|
case EXCEPTION_DATATYPE_MISALIGNMENT:
|
||||||
|
@ -1833,15 +1842,6 @@ static void segv_handler( int signal, siginfo_t *siginfo, void *sigcontext )
|
||||||
rec->ExceptionCode = EXCEPTION_ACCESS_VIOLATION;
|
rec->ExceptionCode = EXCEPTION_ACCESS_VIOLATION;
|
||||||
rec->NumberParameters = 2;
|
rec->NumberParameters = 2;
|
||||||
rec->ExceptionInformation[0] = (get_error_code(context) >> 1) & 0x09;
|
rec->ExceptionInformation[0] = (get_error_code(context) >> 1) & 0x09;
|
||||||
/* Send code 8 (EXCEPTION_EXECUTE_FAULT) only if data execution
|
|
||||||
prevention is enabled */
|
|
||||||
if (rec->ExceptionInformation[0] & 8)
|
|
||||||
{
|
|
||||||
ULONG flags;
|
|
||||||
NtQueryInformationProcess( GetCurrentProcess(), ProcessExecuteFlags,
|
|
||||||
&flags, sizeof(flags), NULL );
|
|
||||||
if (!(flags & MEM_EXECUTE_OPTION_DISABLE)) rec->ExceptionInformation[0] &= 1;
|
|
||||||
}
|
|
||||||
rec->ExceptionInformation[1] = (ULONG_PTR)siginfo->si_addr;
|
rec->ExceptionInformation[1] = (ULONG_PTR)siginfo->si_addr;
|
||||||
break;
|
break;
|
||||||
case TRAP_x86_ALIGNFLT: /* Alignment check exception */
|
case TRAP_x86_ALIGNFLT: /* Alignment check exception */
|
||||||
|
|
Loading…
Reference in New Issue