Safe SEH is better than abstinence

release
Slava Pestov 2010-04-05 14:49:32 -05:00
parent c0af678c5b
commit 9b44451682
4 changed files with 14 additions and 3 deletions

View File

@ -2,10 +2,12 @@
LINK_FLAGS = /nologo /DEBUG shell32.lib
CL_FLAGS = /nologo /Zi /O2 /W3 /DFACTOR_DEBUG
!ELSE
LINK_FLAGS = /nologo /safeseh:no shell32.lib
LINK_FLAGS = /nologo /safeseh shell32.lib
CL_FLAGS = /nologo /O2 /W3
!ENDIF
ML_FLAGS = /nologo /safeseh
EXE_OBJS = vm\main-windows-nt.obj vm\factor.res
DLL_OBJS = vm\os-windows-nt.obj \
@ -47,6 +49,7 @@ DLL_OBJS = vm\os-windows-nt.obj \
vm\profiler.obj \
vm\quotations.obj \
vm\run.obj \
vm\safeseh.obj \
vm\strings.obj \
vm\to_tenured_collector.obj \
vm\tuples.obj \
@ -60,6 +63,9 @@ DLL_OBJS = vm\os-windows-nt.obj \
.c.obj:
cl $(CL_FLAGS) /Fo$@ /c $<
.asm.obj:
ml $(ML_FLAGS) /Fo$@ /c $<
.rs.res:
rc $<

View File

@ -87,7 +87,7 @@ LONG factor_vm::exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c,
return ExceptionContinueExecution;
}
LONG exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch)
extern "C" LONG exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch)
{
return current_vm()->exception_handler(e,frame,c,dispatch);
}

View File

@ -22,7 +22,7 @@ typedef char symbol_char;
#define FACTOR_DLL NULL
LONG exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch);
extern "C" LONG exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c, void *dispatch);
// SSE traps raise these exception codes, which are defined in internal NT headers
// but not winbase.h

5
vm/safeseh.asm Executable file
View File

@ -0,0 +1,5 @@
.386
.model flat
exception_handler proto
.safeseh exception_handler
end