]> gitweb.factorcode.org Git - factor.git/commitdiff
Safe SEH is better than abstinence
authorSlava Pestov <slava@factorcode.org>
Mon, 5 Apr 2010 19:49:32 +0000 (14:49 -0500)
committerSlava Pestov <slava@factorcode.org>
Mon, 5 Apr 2010 20:02:32 +0000 (15:02 -0500)
Nmakefile
vm/os-windows-nt.cpp
vm/os-windows-nt.hpp
vm/safeseh.asm [new file with mode: 0755]

index 9df7a6a1eee94bad9e9b40f349d01335da6f4185..dc28e1884cdec4b1f44782fd91f614e0ba8d62f6 100755 (executable)
--- a/Nmakefile
+++ b/Nmakefile
@@ -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 $<
 
index 4f90d7f641d24ed5bfe34d85c6356aa8f8062d1f..711b2a8445a02679ee806cd5268db52691544884 100755 (executable)
@@ -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);
 }
index d84ac972982991b63c83d90704afb9ce6135603c..2ba75ccf543fdfbda1c7ee97d083917c56cefffb 100755 (executable)
@@ -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
diff --git a/vm/safeseh.asm b/vm/safeseh.asm
new file mode 100755 (executable)
index 0000000..fb706c1
--- /dev/null
@@ -0,0 +1,5 @@
+.386\r
+.model flat\r
+exception_handler proto\r
+.safeseh exception_handler\r
+end\r