@@ -418,21 +418,21 @@ int
418418faulthandler_enable (void )
419419{
420420 size_t i ;
421- fault_handler_t * handler ;
422- #ifdef HAVE_SIGACTION
423- struct sigaction action ;
424- #endif
425- int err ;
426421
427422 if (fatal_error .enabled ) {
428423 return 0 ;
429424 }
430-
431425 fatal_error .enabled = 1 ;
432426
433427 for (i = 0 ; i < faulthandler_nsignals ; i ++ ) {
434- handler = & faulthandler_handlers [i ];
428+ fault_handler_t * handler ;
429+ #ifdef HAVE_SIGACTION
430+ struct sigaction action ;
431+ #endif
432+ int err ;
435433
434+ handler = & faulthandler_handlers [i ];
435+ assert (!handler -> enabled );
436436#ifdef HAVE_SIGACTION
437437 action .sa_handler = faulthandler_fatal_error ;
438438 sigemptyset (& action .sa_mask );
@@ -1062,7 +1062,6 @@ faulthandler_fatal_error_py(PyObject *self, PyObject *args)
10621062 Py_RETURN_NONE ;
10631063}
10641064
1065-
10661065#if defined(HAVE_SIGALTSTACK ) && defined(HAVE_SIGACTION )
10671066#define FAULTHANDLER_STACK_OVERFLOW
10681067
@@ -1079,41 +1078,26 @@ stack_overflow(Py_uintptr_t min_sp, Py_uintptr_t max_sp, size_t *depth)
10791078 /* allocate 4096 bytes on the stack at each call */
10801079 unsigned char buffer [4096 ];
10811080 Py_uintptr_t sp = (Py_uintptr_t )& buffer ;
1082- Py_uintptr_t stop ;
1083-
10841081 * depth += 1 ;
1085- if (sp < min_sp || max_sp < sp ) {
1086- printf ("call #%lu\n" , (unsigned long )* depth );
1082+ if (sp < min_sp || max_sp < sp )
10871083 return sp ;
1088- }
1089-
1090- memset (buffer , (unsigned char )* depth , sizeof (buffer ));
1091- stop = stack_overflow (min_sp , max_sp , depth ) + buffer [0 ];
1092-
1093- memset (buffer , (unsigned char )stop , sizeof (buffer ));
1094- stop = stack_overflow (min_sp , max_sp , depth ) + buffer [0 ];
1095-
1096- return stop ;
1084+ buffer [0 ] = 1 ;
1085+ buffer [4095 ] = 0 ;
1086+ return stack_overflow (min_sp , max_sp , depth );
10971087}
10981088
10991089static PyObject *
11001090faulthandler_stack_overflow (PyObject * self )
11011091{
11021092 size_t depth , size ;
11031093 Py_uintptr_t sp = (Py_uintptr_t )& depth ;
1104- Py_uintptr_t min_sp , max_sp , stop ;
1094+ Py_uintptr_t stop ;
11051095
11061096 faulthandler_suppress_crash_report ();
1107-
11081097 depth = 0 ;
1109- if (sp > STACK_OVERFLOW_MAX_SIZE )
1110- min_sp = sp - STACK_OVERFLOW_MAX_SIZE ;
1111- else
1112- min_sp = 0 ;
1113- max_sp = sp + STACK_OVERFLOW_MAX_SIZE ;
1114-
1115- stop = stack_overflow (min_sp , max_sp , & depth );
1116-
1098+ stop = stack_overflow (sp - STACK_OVERFLOW_MAX_SIZE ,
1099+ sp + STACK_OVERFLOW_MAX_SIZE ,
1100+ & depth );
11171101 if (sp < stop )
11181102 size = stop - sp ;
11191103 else
@@ -1124,7 +1108,7 @@ faulthandler_stack_overflow(PyObject *self)
11241108 size , depth );
11251109 return NULL ;
11261110}
1127- #endif /* ( defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION)) ... */
1111+ #endif /* defined(HAVE_SIGALTSTACK) && defined(HAVE_SIGACTION) */
11281112
11291113
11301114static int
0 commit comments