From f626b7b504df454d289527a4f922b09deeae9e21 Mon Sep 17 00:00:00 2001 From: Dong-hee Na Date: Mon, 7 Nov 2022 10:19:25 +0900 Subject: gh-96055: Update faulthandler to emit proper unexpect signal number (gh-99162) --- .../2022-11-06-22-59-02.gh-issue-96055.TmQuJn.rst | 2 ++ Modules/faulthandler.c | 20 ++++++++++++++++---- 2 files changed, 18 insertions(+), 4 deletions(-) create mode 100644 Misc/NEWS.d/next/Core and Builtins/2022-11-06-22-59-02.gh-issue-96055.TmQuJn.rst diff --git a/Misc/NEWS.d/next/Core and Builtins/2022-11-06-22-59-02.gh-issue-96055.TmQuJn.rst b/Misc/NEWS.d/next/Core and Builtins/2022-11-06-22-59-02.gh-issue-96055.TmQuJn.rst new file mode 100644 index 0000000..c72fb21 --- /dev/null +++ b/Misc/NEWS.d/next/Core and Builtins/2022-11-06-22-59-02.gh-issue-96055.TmQuJn.rst @@ -0,0 +1,2 @@ +Update :mod:`faulthandler` to emit an error message with the proper +unexpected signal number. Patch by Dong-hee Na. diff --git a/Modules/faulthandler.c b/Modules/faulthandler.c index 2f6a219..fa4c2d0 100644 --- a/Modules/faulthandler.c +++ b/Modules/faulthandler.c @@ -333,14 +333,17 @@ faulthandler_fatal_error(int signum) size_t i; fault_handler_t *handler = NULL; int save_errno = errno; + int found = 0; if (!fatal_error.enabled) return; for (i=0; i < faulthandler_nsignals; i++) { handler = &faulthandler_handlers[i]; - if (handler->signum == signum) + if (handler->signum == signum) { + found = 1; break; + } } if (handler == NULL) { /* faulthandler_nsignals == 0 (unlikely) */ @@ -350,9 +353,18 @@ faulthandler_fatal_error(int signum) /* restore the previous handler */ faulthandler_disable_fatal_handler(handler); - PUTS(fd, "Fatal Python error: "); - PUTS(fd, handler->name); - PUTS(fd, "\n\n"); + if (found) { + PUTS(fd, "Fatal Python error: "); + PUTS(fd, handler->name); + PUTS(fd, "\n\n"); + } + else { + char unknown_signum[23] = {0,}; + snprintf(unknown_signum, 23, "%d", signum); + PUTS(fd, "Fatal Python error from unexpected signum: "); + PUTS(fd, unknown_signum); + PUTS(fd, "\n\n"); + } faulthandler_dump_traceback(fd, fatal_error.all_threads, fatal_error.interp); -- cgit v0.12