diff options
author | Ulrich Drepper <drepper@redhat.com> | 2003-01-28 09:08:07 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2003-01-28 09:08:07 +0000 |
commit | 772e3426a7b6f5200cb1029d41308b8b666cdbab (patch) | |
tree | 7f881f4054beae5b9352ad9771e37ce31dee8b8d | |
parent | 0566b130fbb77c2673d0459b4d9ff825fc68b094 (diff) | |
download | glibc-772e3426a7b6f5200cb1029d41308b8b666cdbab.tar glibc-772e3426a7b6f5200cb1029d41308b8b666cdbab.tar.gz glibc-772e3426a7b6f5200cb1029d41308b8b666cdbab.tar.bz2 glibc-772e3426a7b6f5200cb1029d41308b8b666cdbab.zip |
Update.
2003-01-28 Ulrich Drepper <drepper@redhat.com>
* sysdeps/unix/common/pause.c (do_pause): New function. Split
from __libc_pause. Implement using sigsuspend.
(__libc_pause): Call do_pause to do the real work.
* sysdeps/posix/sigpause.c (do_sigpause): Check range of
sig_or_mask parameter is is_sig != 0.
-rw-r--r-- | ChangeLog | 9 | ||||
-rw-r--r-- | sysdeps/posix/sigpause.c | 5 | ||||
-rw-r--r-- | sysdeps/unix/common/pause.c | 20 |
3 files changed, 28 insertions, 6 deletions
@@ -1,3 +1,12 @@ +2003-01-28 Ulrich Drepper <drepper@redhat.com> + + * sysdeps/unix/common/pause.c (do_pause): New function. Split + from __libc_pause. Implement using sigsuspend. + (__libc_pause): Call do_pause to do the real work. + + * sysdeps/posix/sigpause.c (do_sigpause): Check range of + sig_or_mask parameter is is_sig != 0. + 2003-01-21 Philip Blundell <philb@gnu.org> * sysdeps/unix/sysv/linux/bits/ioctls.h (SIOCSIFNAME): Define. diff --git a/sysdeps/posix/sigpause.c b/sysdeps/posix/sigpause.c index e85a813ab0..bf2ca6588d 100644 --- a/sysdeps/posix/sigpause.c +++ b/sysdeps/posix/sigpause.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,92,94-98,2000,02 Free Software Foundation, Inc. +/* Copyright (C) 1991,92,94-98,2000,2002,2003 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -34,7 +34,8 @@ do_sigpause (int sig_or_mask, int is_sig) { /* The modern X/Open implementation is requested. */ if (__sigprocmask (0, NULL, &set) < 0 - /* Yes, we call `sigdelset' and not `__sigdelset'. */ + /* Perform the tests from sigdelset ourselves. */ + || sig_or_mask <= 0 || sig_or_mask >= NSIG || __sigdelset (&set, sig_or_mask) < 0) return -1; } diff --git a/sysdeps/unix/common/pause.c b/sysdeps/unix/common/pause.c index 508a3e0b53..14b87e44d0 100644 --- a/sysdeps/unix/common/pause.c +++ b/sysdeps/unix/common/pause.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991, 1996, 2002 Free Software Foundation, Inc. +/* Copyright (C) 1991, 1996, 2002, 2003 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -22,16 +22,28 @@ /* Suspend the process until a signal arrives. This always returns -1 and sets errno to EINTR. */ +static void +do_pause (void) +{ + sigset_t set; + + sigemptyset (&set); + + __sigsuspend (&set); +} int __libc_pause (void) { if (SINGLE_THREAD_P) - return __sigpause (__sigblock (0), 0); + { + do_pause (); + return -1; + } int oldtype = LIBC_CANCEL_ASYNC (); - int result = __sigpause (__sigblock (0), 0); + (void) do_pause (); LIBC_CANCEL_RESET (oldtype); - return result; + return -1; } weak_alias (__libc_pause, pause) |