bpo-21131: Fix faulthandler.register(chain=True) stack (GH-15276)

faulthandler now allocates a dedicated stack of SIGSTKSZ*2 bytes,
instead of just SIGSTKSZ bytes. Calling the previous signal handler
in faulthandler signal handler uses more than SIGSTKSZ bytes of stack
memory on some platforms.
This commit is contained in:
Victor Stinner 2019-08-14 23:35:27 +02:00 committed by GitHub
parent 2814620657
commit ac827edc49
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 9 additions and 1 deletions

View File

@ -0,0 +1,4 @@
Fix ``faulthandler.register(chain=True)`` stack. faulthandler now allocates a
dedicated stack of ``SIGSTKSZ*2`` bytes, instead of just ``SIGSTKSZ`` bytes.
Calling the previous signal handler in faulthandler signal handler uses more
than ``SIGSTKSZ`` bytes of stack memory on some platforms.

View File

@ -1325,7 +1325,11 @@ _PyFaulthandler_Init(int enable)
* be able to allocate memory on the stack, even on a stack overflow. If it * be able to allocate memory on the stack, even on a stack overflow. If it
* fails, ignore the error. */ * fails, ignore the error. */
stack.ss_flags = 0; stack.ss_flags = 0;
stack.ss_size = SIGSTKSZ; /* bpo-21131: allocate dedicated stack of SIGSTKSZ*2 bytes, instead of just
SIGSTKSZ bytes. Calling the previous signal handler in faulthandler
signal handler uses more than SIGSTKSZ bytes of stack memory on some
platforms. */
stack.ss_size = SIGSTKSZ * 2;
stack.ss_sp = PyMem_Malloc(stack.ss_size); stack.ss_sp = PyMem_Malloc(stack.ss_size);
if (stack.ss_sp != NULL) { if (stack.ss_sp != NULL) {
err = sigaltstack(&stack, &old_stack); err = sigaltstack(&stack, &old_stack);