]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
gh-96055: Update faulthandler to emit proper unexpect signal number (gh-99162)
authorDong-hee Na <donghee.na@python.org>
Mon, 7 Nov 2022 01:19:25 +0000 (10:19 +0900)
committerGitHub <noreply@github.com>
Mon, 7 Nov 2022 01:19:25 +0000 (10:19 +0900)
Misc/NEWS.d/next/Core and Builtins/2022-11-06-22-59-02.gh-issue-96055.TmQuJn.rst [new file with mode: 0644]
Modules/faulthandler.c

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 (file)
index 0000000..c72fb21
--- /dev/null
@@ -0,0 +1,2 @@
+Update :mod:`faulthandler` to emit an error message with the proper
+unexpected signal number. Patch by Dong-hee Na.
index 2f6a2198ab3e32c40d71ca7fde50f37ed10419bf..fa4c2d0cccd1b60f4900f0492c5e9c4a013a81a4 100644 (file)
@@ -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);