From: Christophe Zeitouny Date: Thu, 23 Mar 2017 17:14:29 +0000 (-0700) Subject: faulthandler: Restore the old sigaltstack during teardown (#777) X-Git-Tag: v3.7.0a1~1086 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=20fbf8accd494fd15b0fc4c84928178c71ead4d1;p=python faulthandler: Restore the old sigaltstack during teardown (#777) --- diff --git a/Misc/ACKS b/Misc/ACKS index c99aeaa335..2056efe8fb 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -1716,6 +1716,7 @@ Artur Zaprzala Mike Zarnstorff Yury V. Zaytsev Siebren van der Zee +Christophe Zeitouny Nickolai Zeldovich Yuxiao Zeng Uwe Zessin diff --git a/Misc/NEWS b/Misc/NEWS index 97c45d4776..8cc8b9f971 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -287,6 +287,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 diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index 4a03eaf96a..fc9490d0d4 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -124,6 +124,7 @@ static const size_t faulthandler_nsignals = \ #ifdef HAVE_SIGALTSTACK static stack_t stack; +static stack_t old_stack; #endif @@ -1317,7 +1318,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; @@ -1373,6 +1374,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, ¤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); stack.ss_sp = NULL; }