This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
[PATCH,HURD] Fix signal-catching functions
- From: Samuel Thibault <samuel dot thibault at ens-lyon dot org>
- To: roland at redhat dot com
- Cc: libc-alpha at sources dot redhat dot com
- Date: Mon, 13 Sep 2010 04:35:49 +0200
- Subject: [PATCH,HURD] Fix signal-catching functions
2010-09-13 Samuel Thibault <samuel.thibault@ens-lyon.org>
Fix signal-catching functions.
We need to restore the signal mask, because else the signal handling
code will have blocked the catched signal and for instance calling
hurd_catch_signal again would then dump core. There was also a trivial
inverted logic.
* hurd/catch-signal.c (hurd_catch_signal): Use sigsetjmp/siglongjmp
instead of setjmp/longjmp to restore the signal mask. Call sigsetjmp
when handler == SIG_ERR, not when handler != SIG_ERR.
---
catch-signal.c | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/hurd/catch-signal.c b/hurd/catch-signal.c
index 583f99e..42f490e 100644
--- a/hurd/catch-signal.c
+++ b/hurd/catch-signal.c
@@ -28,9 +28,9 @@ hurd_catch_signal (sigset_t sigset,
error_t (*operate) (struct hurd_signal_preemptor *),
sighandler_t handler)
{
- jmp_buf buf;
+ sigjmp_buf buf;
void throw (int signo, long int sigcode, struct sigcontext *scp)
- { longjmp (buf, scp->sc_error ?: EGRATUITOUS); }
+ { siglongjmp (buf, scp->sc_error ?: EGRATUITOUS); }
struct hurd_signal_preemptor preemptor =
{
@@ -41,12 +41,12 @@ hurd_catch_signal (sigset_t sigset,
struct hurd_sigstate *const ss = _hurd_self_sigstate ();
error_t error;
- if (handler == SIG_ERR)
+ if (handler != SIG_ERR)
/* Not our handler; don't bother saving state. */
error = 0;
else
/* This returns again with nonzero value when we preempt a signal. */
- error = setjmp (buf);
+ error = sigsetjmp (buf, 1);
if (error == 0)
{