From: Miss Islington (bot) <31488909+miss-islington@users.noreply.github.com> Date: Wed, 14 Aug 2019 22:02:12 +0000 (-0700) Subject: bpo-21131: Fix faulthandler.register(chain=True) stack (GH-15276) X-Git-Tag: v3.8.0b4~95 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=b8e682427a80798fec90dce31392beaf616c3e37;p=python 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. (cherry picked from commit ac827edc493d3ac3f5b9b0cc353df1d4b418a9aa) Co-authored-by: Victor Stinner --- diff --git a/Misc/NEWS.d/next/Library/2019-08-14-15-34-23.bpo-21131.0MMQRi.rst b/Misc/NEWS.d/next/Library/2019-08-14-15-34-23.bpo-21131.0MMQRi.rst new file mode 100644 index 0000000000..d330aca1c1 --- /dev/null +++ b/Misc/NEWS.d/next/Library/2019-08-14-15-34-23.bpo-21131.0MMQRi.rst @@ -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. diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index f2b5a503f4..7b325996b2 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -1325,7 +1325,11 @@ _PyFaulthandler_Init(int enable) * be able to allocate memory on the stack, even on a stack overflow. If it * fails, ignore the error. */ 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); if (stack.ss_sp != NULL) { err = sigaltstack(&stack, &old_stack);