bug-gnulib
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: make signal handlers more reliable


From: Bruno Haible
Subject: Re: make signal handlers more reliable
Date: Tue, 19 Mar 2019 23:38:16 +0100
User-agent: KMail/5.1.3 (Linux/4.4.0-141-generic; KDE/5.18.0; x86_64; ; )

Hi Paul,

> it's nice that you found the bug in c-stack.

There was also another bug in c-stack: The SIGSEGV handler, in the case
where the stack overflow is not yet serious, clobbered errno before
returning.

Fixed both together like this:


2019-03-19  Bruno Haible  <address@hidden>

        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.

diff --git a/lib/c-stack.c b/lib/c-stack.c
index 929bb3a..f50a4a5 100644
--- a/lib/c-stack.c
+++ b/lib/c-stack.c
@@ -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);
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]