faulthandler: Restore the old sigaltstack during teardown (GH-777) (GH-797)
(cherry picked from commit 20fbf8accd
)
This commit is contained in:
parent
ee51327a23
commit
90eafdb154
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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, ¤t_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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue