]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-21131: Fix faulthandler.register(chain=True) stack (GH-15276)
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Wed, 14 Aug 2019 22:09:39 +0000 (15:09 -0700)
committerGitHub <noreply@github.com>
Wed, 14 Aug 2019 22:09:39 +0000 (15:09 -0700)
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 <vstinner@redhat.com>
Misc/NEWS.d/next/Library/2019-08-14-15-34-23.bpo-21131.0MMQRi.rst [new file with mode: 0644]
Modules/faulthandler.c

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 (file)
index 0000000..d330aca
--- /dev/null
@@ -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.
index 0dbd5a3342b013ee1013ab322a23a38eba6fe7f5..97c64f633091f227bcbc43dea27fb1359941f067 100644 (file)
@@ -1322,7 +1322,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);