implements PyOS_CheckStack for Windows and MSVC. this fixes a
couple of potential stack overflows, including bug #110615. closes patch #101238
This commit is contained in:
parent
0ae722e0a2
commit
2f15b25da2
|
@ -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
|
||||
|
|
|
@ -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 */
|
||||
|
|
Loading…
Reference in New Issue