Programs that use POSIX signals, call `sigaction' to install a new
handler and/or report and old one. The current version of this
function in the library always report the old handler as SIG_DFL,
even if a handler has been installed. So if a program disables and
then re-enables signal catching by saving and restoring the handlers,
after the first such fragment, all the saved/restored handlers are
returned to the default handling.
The function also always reports success, even if an illegal signal
number is passed.
Apply this patch to src/libc/posix/signal/sigactio.c:
*** posix/signal/sigactio.c~0 Sun Apr 2 01:11:10 1995
--- posix/signal/sigactio.c Thu Apr 4 19:50:18 1996
***************
*** 1,19 ****
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
#include <signal.h>
int
sigaction(int _sig, const struct sigaction *_act, struct sigaction *_oact)
{
if (_oact)
{
/* FIXME */
! _oact->sa_handler = SIG_DFL;
! sigemptyset(&_oact->sa_mask);
_oact->sa_flags = 0;
}
if (_act)
{
! signal(_sig, _act->sa_handler);
}
! return 0;
}
--- 1,35 ----
/* Copyright (C) 1995 DJ Delorie, see COPYING.DJ for details */
#include <signal.h>
+ #include <errno.h>
int
sigaction(int _sig, const struct sigaction *_act, struct sigaction *_oact)
{
+ int retval = 0;
+
if (_oact)
{
+ void (*installed_sig)(int) = signal (_sig, SIG_IGN);
+
/* FIXME */
! if (installed_sig == SIG_ERR)
! {
! retval = -1;
! errno = EINVAL;
! }
! else
! signal (_sig, installed_sig);
! _oact->sa_handler = installed_sig;
! retval = sigemptyset(&_oact->sa_mask);
_oact->sa_flags = 0;
}
if (_act)
{
! if (signal(_sig, _act->sa_handler) == SIG_ERR)
! {
! retval = -1;
! errno = EINVAL;
! }
}
! return retval;
}