From 53b4fed6efb980044ff7152c725557de846a23bf Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Tue, 28 Sep 2004 22:44:12 +0000 Subject: [PATCH] Update. * sysdeps/unix/sysv/linux/sigwait.c (do_sigwait): Make sure SIGSETXID is not blocked. * sysdeps/unix/sysv/linux/sigwaitinfo.c (do_sigwaitinfo): Likewise. * sysdeps/unix/sysv/linux/sigtimedwait.c (do_sigtimedwait): Likewise. * sysdeps/unix/sysv/linux/sigprocmask.c (__sigprocmask): Likewise. * sysdeps/generic/sigfillset.c (sigfillset): Don't set SIGSETXID. --- ChangeLog | 7 +++++++ nptl/sysdeps/pthread/pthread_sigmask.c | 10 ++++++---- nptl/sysdeps/pthread/sigaction.c | 4 ++-- nptl/sysdeps/unix/sysv/linux/pthread_kill.c | 7 ++++--- sysdeps/generic/sigfillset.c | 6 +++++- sysdeps/unix/sysv/linux/sigprocmask.c | 14 +++++++++++--- sysdeps/unix/sysv/linux/sigtimedwait.c | 12 ++++++++++-- sysdeps/unix/sysv/linux/sigwait.c | 12 ++++++++++-- sysdeps/unix/sysv/linux/sigwaitinfo.c | 12 ++++++++++-- 9 files changed, 65 insertions(+), 19 deletions(-) diff --git a/ChangeLog b/ChangeLog index ccf33bf625..f96596caec 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2004-09-28 Ulrich Drepper + * sysdeps/unix/sysv/linux/sigwait.c (do_sigwait): Make sure + SIGSETXID is not blocked. + * sysdeps/unix/sysv/linux/sigwaitinfo.c (do_sigwaitinfo): Likewise. + * sysdeps/unix/sysv/linux/sigtimedwait.c (do_sigtimedwait): Likewise. + * sysdeps/unix/sysv/linux/sigprocmask.c (__sigprocmask): Likewise. + * sysdeps/generic/sigfillset.c (sigfillset): Don't set SIGSETXID. + * sunrpc/get_myaddr.c (get_myaddress): Fix test for failing getifaddrs call. * sunrpc/pmap_clnt.c (__get_myaddress): Likewise. diff --git a/nptl/sysdeps/pthread/pthread_sigmask.c b/nptl/sysdeps/pthread/pthread_sigmask.c index efe186ac2c..0d12fe6bf0 100644 --- a/nptl/sysdeps/pthread/pthread_sigmask.c +++ b/nptl/sysdeps/pthread/pthread_sigmask.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -31,13 +31,15 @@ pthread_sigmask (how, newmask, oldmask) { sigset_t local_newmask; - /* The only thing we have to make sure here is that SIGCANCEL is not - blocked. */ + /* The only thing we have to make sure here is that SIGCANCEL and + SIGSETXID is not blocked. */ if (newmask != NULL - && __builtin_expect (__sigismember (newmask, SIGCANCEL), 0)) + && (__builtin_expect (__sigismember (newmask, SIGCANCEL), 0) + || __builtin_expect (__sigismember (newmask, SIGSETXID), 0))) { local_newmask = *newmask; __sigdelset (&local_newmask, SIGCANCEL); + __sigdelset (&local_newmask, SIGSETXID); newmask = &local_newmask; } diff --git a/nptl/sysdeps/pthread/sigaction.c b/nptl/sysdeps/pthread/sigaction.c index 392cb65c90..4d36150a90 100644 --- a/nptl/sysdeps/pthread/sigaction.c +++ b/nptl/sysdeps/pthread/sigaction.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -36,7 +36,7 @@ __sigaction (sig, act, oact) const struct sigaction *act; struct sigaction *oact; { - if (sig == SIGCANCEL) + if (__builtin_expect (sig == SIGCANCEL || sig == SIGSETXID, 0)) { __set_errno (EINVAL); return -1; diff --git a/nptl/sysdeps/unix/sysv/linux/pthread_kill.c b/nptl/sysdeps/unix/sysv/linux/pthread_kill.c index 87577be4dc..9115d6f40b 100644 --- a/nptl/sysdeps/unix/sysv/linux/pthread_kill.c +++ b/nptl/sysdeps/unix/sysv/linux/pthread_kill.c @@ -1,4 +1,4 @@ -/* Copyright (C) 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2002. @@ -37,8 +37,9 @@ __pthread_kill (threadid, signo) /* Not a valid thread handle. */ return ESRCH; - /* Disallow sending the signal we use for cancellation. */ - if (signo == SIGCANCEL || signo == SIGTIMER) + /* Disallow sending the signal we use for cancellation, timers, for + for the setxid implementation. */ + if (signo == SIGCANCEL || signo == SIGTIMER || signo == SIGSETXID) return EINVAL; /* We have a special syscall to do the work. */ diff --git a/sysdeps/generic/sigfillset.c b/sysdeps/generic/sigfillset.c index 5f91fa6bda..95d52cf0c0 100644 --- a/sysdeps/generic/sigfillset.c +++ b/sysdeps/generic/sigfillset.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1991,96,97,2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 1991,96,97,2002,2003,2004 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 @@ -37,6 +37,10 @@ sigfillset (set) #ifdef SIGCANCEL __sigdelset (set, SIGCANCEL); #endif + /* Likewise for the signal to implement setxid. */ +#ifdef SIGSETXID + __sigdelset (set, SIGSETXID); +#endif return 0; } diff --git a/sysdeps/unix/sysv/linux/sigprocmask.c b/sysdeps/unix/sysv/linux/sigprocmask.c index e1b57566a5..1573780d8e 100644 --- a/sysdeps/unix/sysv/linux/sigprocmask.c +++ b/sysdeps/unix/sysv/linux/sigprocmask.c @@ -43,12 +43,20 @@ __sigprocmask (how, set, oset) #ifdef SIGCANCEL sigset_t local_newmask; - /* The only thing we have to make sure here is that SIGCANCEL is not - blocked. */ - if (set != NULL && __builtin_expect (__sigismember (set, SIGCANCEL), 0)) + /* The only thing we have to make sure here is that SIGCANCEL and + SIGSETXID are not blocked. */ + if (set != NULL + && (__builtin_expect (__sigismember (set, SIGCANCEL), 0) +# ifdef SIGSETXID + || __builtin_expect (__sigismember (set, SIGSETXID), 0) +# endif + )) { local_newmask = *set; __sigdelset (&local_newmask, SIGCANCEL); +# ifdef SIGSETXID + __sigdelset (&local_newmask, SIGSETXID); +# endif set = &local_newmask; } #endif diff --git a/sysdeps/unix/sysv/linux/sigtimedwait.c b/sysdeps/unix/sysv/linux/sigtimedwait.c index 1705cb10bd..adeadc1587 100644 --- a/sysdeps/unix/sysv/linux/sigtimedwait.c +++ b/sysdeps/unix/sysv/linux/sigtimedwait.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997, 1998, 2000, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 1997,1998,2000,2002,2003,2004 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 @@ -32,12 +32,20 @@ do_sigtimedwait (const sigset_t *set, siginfo_t *info, { #ifdef SIGCANCEL sigset_t tmpset; - if (set != NULL && __sigismember (set, SIGCANCEL)) + if (set != NULL + && (__builtin_expect (__sigismember (set, SIGCANCEL), 0) +# ifdef SIGSETXID + || __builtin_expect (__sigismember (set, SIGSETXID), 0) +# endif + )) { /* Create a temporary mask without the bit for SIGCANCEL set. */ // We are not copying more than we have to. memcpy (&tmpset, set, _NSIG / 8); __sigdelset (&tmpset, SIGCANCEL); +# ifdef SIGSETXID + __sigdelset (&tmpset, SIGSETXID); +# endif set = &tmpset; } #endif diff --git a/sysdeps/unix/sysv/linux/sigwait.c b/sysdeps/unix/sysv/linux/sigwait.c index f755928493..7c865963cd 100644 --- a/sysdeps/unix/sysv/linux/sigwait.c +++ b/sysdeps/unix/sysv/linux/sigwait.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997, 1998, 2000, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 1997,1998,2000,2002,2003,2004 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 @@ -36,12 +36,20 @@ do_sigwait (const sigset_t *set, int *sig) #ifdef SIGCANCEL sigset_t tmpset; - if (set != NULL && __sigismember (set, SIGCANCEL)) + if (set != NULL + && (__builtin_expect (__sigismember (set, SIGCANCEL), 0) +# ifdef SIGSETXID + || __builtin_expect (__sigismember (set, SIGSETXID), 0) +# endif + )) { /* Create a temporary mask without the bit for SIGCANCEL set. */ // We are not copying more than we have to. memcpy (&tmpset, set, _NSIG / 8); __sigdelset (&tmpset, SIGCANCEL); +# ifdef SIGSETXID + __sigdelset (&tmpset, SIGSETXID); +# endif set = &tmpset; } #endif diff --git a/sysdeps/unix/sysv/linux/sigwaitinfo.c b/sysdeps/unix/sysv/linux/sigwaitinfo.c index a2dec820fc..a51a01f20b 100644 --- a/sysdeps/unix/sysv/linux/sigwaitinfo.c +++ b/sysdeps/unix/sysv/linux/sigwaitinfo.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1997, 1998, 2000, 2002, 2003 Free Software Foundation, Inc. +/* Copyright (C) 1997,1998,2000,2002,2003,2004 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 @@ -33,12 +33,20 @@ do_sigwaitinfo (const sigset_t *set, siginfo_t *info) { #ifdef SIGCANCEL sigset_t tmpset; - if (set != NULL && __sigismember (set, SIGCANCEL)) + if (set != NULL + && (__builtin_expect (__sigismember (set, SIGCANCEL), 0) +# ifdef SIGSETXID + || __builtin_expect (__sigismember (set, SIGSETXID), 0) +# endif + )) { /* Create a temporary mask without the bit for SIGCANCEL set. */ // We are not copying more than we have to. memcpy (&tmpset, set, _NSIG / 8); __sigdelset (&tmpset, SIGCANCEL); +# ifdef SIGSETXID + __sigdelset (&tmpset, SIGSETXID); +# endif set = &tmpset; } #endif -- 2.11.4.GIT