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

Miss Islington (bot) webhook-mailer at python.org
Wed Aug 14 18:09:43 EDT 2019


https://github.com/python/cpython/commit/1581d9c405f140491791a07dca3f6166bc499ec1
commit: 1581d9c405f140491791a07dca3f6166bc499ec1
branch: 3.7
author: Miss Islington (bot) <31488909+miss-islington at users.noreply.github.com>
committer: GitHub <noreply at github.com>
date: 2019-08-14T15:09:39-07:00
summary:

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 <vstinner at redhat.com>

files:
A Misc/NEWS.d/next/Library/2019-08-14-15-34-23.bpo-21131.0MMQRi.rst
M 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
index 000000000000..d330aca1c17d
--- /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 0dbd5a3342b0..97c64f633091 100644
--- a/Modules/faulthandler.c
+++ b/Modules/faulthandler.c
@@ -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);



More information about the Python-checkins mailing list