faulthandler: Restore the old sigaltstack during teardown (GH-777) (GH-796)

(cherry picked from commit 20fbf8accd)
This commit is contained in:
Christophe Zeitouny 2017-03-24 04:21:37 -07:00 committed by Mariatta
parent a6a856f4d8
commit 6a45811d06
3 changed files with 20 additions and 1 deletions

View file

@ -1679,6 +1679,7 @@ Artur Zaprzala
Mike Zarnstorff
Yury V. Zaytsev
Siebren van der Zee
Christophe Zeitouny
Nickolai Zeldovich
Yuxiao Zeng
Uwe Zessin

View file

@ -46,6 +46,9 @@ Extension Modules
Library
-------
- bpo-29884: faulthandler: Restore the old sigaltstack during teardown.
Patch by Christophe Zeitouny.
- bpo-25455: Fixed crashes in repr of recursive buffered file-like objects.
- bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords

View file

@ -124,6 +124,7 @@ static const unsigned char faulthandler_nsignals = \
#ifdef HAVE_SIGALTSTACK
static stack_t stack;
static stack_t old_stack;
#endif
@ -1148,7 +1149,7 @@ int _PyFaulthandler_Init(void)
stack.ss_size = SIGSTKSZ;
stack.ss_sp = PyMem_Malloc(stack.ss_size);
if (stack.ss_sp != NULL) {
err = sigaltstack(&stack, NULL);
err = sigaltstack(&stack, &old_stack);
if (err) {
PyMem_Free(stack.ss_sp);
stack.ss_sp = NULL;
@ -1204,6 +1205,20 @@ void _PyFaulthandler_Fini(void)
faulthandler_disable();
#ifdef HAVE_SIGALTSTACK
if (stack.ss_sp != NULL) {
/* Fetch the current alt stack */
stack_t current_stack;
if (sigaltstack(NULL, &current_stack) == 0) {
if (current_stack.ss_sp == stack.ss_sp) {
/* The current alt stack is the one that we installed.
It is safe to restore the old stack that we found when
we installed ours */
sigaltstack(&old_stack, NULL);
} else {
/* Someone switched to a different alt stack and didn't
restore ours when they were done (if they're done).
There's not much we can do in this unlikely case */
}
}
PyMem_Free(stack.ss_sp);
stack.ss_sp = NULL;
}