diff options
-rw-r--r-- | Include/pythonrun.h | 14 | ||||
-rw-r--r-- | Python/pythonrun.c | 29 |
2 files changed, 42 insertions, 1 deletions
diff --git a/Include/pythonrun.h b/Include/pythonrun.h index c217570..0528702 100644 --- a/Include/pythonrun.h +++ b/Include/pythonrun.h @@ -87,8 +87,20 @@ DL_IMPORT(void) PyOS_FiniInterrupts(void); DL_IMPORT(char *) PyOS_Readline(char *); extern DL_IMPORT(int) (*PyOS_InputHook)(void); extern DL_IMPORT(char) *(*PyOS_ReadlineFunctionPointer)(char *); + +/* Stack size, in "pointers" (so we get extra safety margins + on 64-bit platforms). On a 32-bit platform, this translates + to a 8k margin. */ +#define PYOS_STACK_MARGIN 2048 + +#if defined(WIN32) && defined(_MSC_VER) +/* Enable stack checking under Microsoft C */ +#define USE_STACKCHECK +#endif + #ifdef USE_STACKCHECK -int PyOS_CheckStack(void); /* Check that we aren't overflowing our stack */ +/* Check that we aren't overflowing our stack */ +DL_IMPORT(int) PyOS_CheckStack(void); #endif #ifdef __cplusplus diff --git a/Python/pythonrun.c b/Python/pythonrun.c index 8d571c3..e951ccd 100644 --- a/Python/pythonrun.c +++ b/Python/pythonrun.c @@ -1165,3 +1165,32 @@ Py_FdIsInteractive(FILE *fp, char *filename) (strcmp(filename, "<stdin>") == 0) || (strcmp(filename, "???") == 0); } + + +#if defined(USE_STACKCHECK) +#if defined(WIN32) && defined(_MSC_VER) + +/* Stack checking for Microsoft C */ + +#include <malloc.h> +#include <excpt.h> + +int +PyOS_CheckStack() +{ + __try { + /* _alloca throws a stack overflow exception if there's + not enough space left on the stack */ + _alloca(PYOS_STACK_MARGIN * sizeof(void*)); + return 0; + } __except (EXCEPTION_EXECUTE_HANDLER) { + /* just ignore all errors */ + } + return 1; +} + +#endif /* WIN32 && _MSC_VER */ + +/* Alternate implementations can be added here... */ + +#endif /* USE_STACKCHECK */ |