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

(cherry picked from commit 20fbf8accd)
This commit is contained in:
Christophe Zeitouny 2017-03-24 04:20:40 -07:00 committed by Mariatta
parent ee51327a23
commit 90eafdb154
3 changed files with 20 additions and 1 deletions

View File

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

View File

@ -27,6 +27,9 @@ Core and Builtins
Library 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-25455: Fixed crashes in repr of recursive buffered file-like objects.
- bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords - bpo-29800: Fix crashes in partial.__repr__ if the keys of partial.keywords

View File

@ -124,6 +124,7 @@ static const size_t faulthandler_nsignals = \
#ifdef HAVE_SIGALTSTACK #ifdef HAVE_SIGALTSTACK
static stack_t stack; static stack_t stack;
static stack_t old_stack;
#endif #endif
@ -1310,7 +1311,7 @@ int _PyFaulthandler_Init(void)
stack.ss_size = SIGSTKSZ; stack.ss_size = SIGSTKSZ;
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, NULL); err = sigaltstack(&stack, &old_stack);
if (err) { if (err) {
PyMem_Free(stack.ss_sp); PyMem_Free(stack.ss_sp);
stack.ss_sp = NULL; stack.ss_sp = NULL;
@ -1366,6 +1367,20 @@ void _PyFaulthandler_Fini(void)
faulthandler_disable(); faulthandler_disable();
#ifdef HAVE_SIGALTSTACK #ifdef HAVE_SIGALTSTACK
if (stack.ss_sp != NULL) { 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); PyMem_Free(stack.ss_sp);
stack.ss_sp = NULL; stack.ss_sp = NULL;
} }