]> Savannah Git Hosting - gnulib.git/commitdiff
c-stack: Make signal handlers more reliable.
authorBruno Haible <bruno@clisp.org>
Tue, 19 Mar 2019 22:34:47 +0000 (23:34 +0100)
committerBruno Haible <bruno@clisp.org>
Tue, 19 Mar 2019 22:34:47 +0000 (23:34 +0100)
* lib/c-stack.c (progname): New variable.
(die): Use it.
(c_stack_action): Initialize it.
(segv_handler): Save and restore errno.

ChangeLog
lib/c-stack.c

index 9313fdc4884de61587da00d71789198231b591fd..8a4c5f3d16e0a50f8802b6f37068cf33ff930922 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2019-03-19  Bruno Haible  <bruno@clisp.org>
+
+       c-stack: Make signal handlers more reliable.
+       * lib/c-stack.c (progname): New variable.
+       (die): Use it.
+       (c_stack_action): Initialize it.
+       (segv_handler): Save and restore errno.
+
 2019-03-19  Bruno Haible  <bruno@clisp.org>
 
        Help making signal handlers more reliable.
index 929bb3a3156e93df6f8f19d07037f592323b1fe9..f50a4a5dc9d9965f7448d09b5b85f2d10f6dee02 100644 (file)
@@ -107,6 +107,8 @@ static char const * volatile stack_overflow_message;
    appears to have been a stack overflow, or with a core dump
    otherwise.  This function is async-signal-safe.  */
 
+static char const * volatile progname;
+
 static _GL_ASYNC_SAFE _Noreturn void
 die (int signo)
 {
@@ -119,7 +121,7 @@ die (int signo)
 #endif /* !SIGINFO_WORKS && !HAVE_LIBSIGSEGV */
   segv_action (signo);
   message = signo ? program_error_message : stack_overflow_message;
-  ignore_value (write (STDERR_FILENO, getprogname (), strlen (getprogname ())));
+  ignore_value (write (STDERR_FILENO, progname, strlen (progname)));
   ignore_value (write (STDERR_FILENO, ": ", 2));
   ignore_value (write (STDERR_FILENO, message, strlen (message)));
   ignore_value (write (STDERR_FILENO, "\n", 1));
@@ -170,8 +172,10 @@ segv_handler (void *address _GL_UNUSED, int serious)
 # if DEBUG
   {
     char buf[1024];
+    int saved_errno = errno;
     sprintf (buf, "segv_handler serious=%d\n", serious);
     write (STDERR_FILENO, buf, strlen (buf));
+    errno = saved_errno;
   }
 # endif
 
@@ -206,6 +210,7 @@ c_stack_action (_GL_ASYNC_SAFE void (*action) (int))
   segv_action = action ? action : null_action;
   program_error_message = _("program error");
   stack_overflow_message = _("stack overflow");
+  progname = getprogname ();
 
   /* Always install the overflow handler.  */
   if (stackoverflow_install_handler (overflow_handler,
@@ -298,6 +303,7 @@ c_stack_action (_GL_ASYNC_SAFE void (*action) (int))
   segv_action = action ? action : null_action;
   program_error_message = _("program error");
   stack_overflow_message = _("stack overflow");
+  progname = getprogname ();
 
   sigemptyset (&act.sa_mask);