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

View File

@ -87,7 +87,7 @@ LONG factor_vm::exception_handler(PEXCEPTION_RECORD e, void *frame, PCONTEXT c,
return ExceptionContinueExecution; 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); return current_vm()->exception_handler(e,frame,c,dispatch);
} }

View File

@ -22,7 +22,7 @@ typedef char symbol_char;
#define FACTOR_DLL NULL #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 // SSE traps raise these exception codes, which are defined in internal NT headers
// but not winbase.h // 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