diff options
author | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2017-10-31 23:10:37 -0200 |
---|---|---|
committer | Adhemerval Zanella <adhemerval.zanella@linaro.org> | 2018-04-03 13:30:49 -0300 |
commit | d2dc5467c67bc8625a4fc8f285b6a5443bf43df4 (patch) | |
tree | 27ddabfd779bfcbcc92f095288be5778ec4370ca /sysdeps/generic | |
parent | 511ed56f2e792bea5e7145e1d5d5c93b9f47c41f (diff) | |
download | glibc-d2dc5467c67bc8625a4fc8f285b6a5443bf43df4.tar glibc-d2dc5467c67bc8625a4fc8f285b6a5443bf43df4.tar.gz glibc-d2dc5467c67bc8625a4fc8f285b6a5443bf43df4.tar.bz2 glibc-d2dc5467c67bc8625a4fc8f285b6a5443bf43df4.zip |
Filter out NPTL internal signals (BZ #22391)
This patch filters out the internal NPTL signals (SIGCANCEL/SIGTIMER and
SIGSETXID) from signal functions. GLIBC on Linux requires both signals to
proper implement pthread cancellation, posix timers, and set*id posix
thread synchronization.
And not filtering out the internal signal is troublesome:
- A conformant program on a architecture that does not filter out the
signals might inadvertently disable pthread asynchronous cancellation,
set*id synchronization or posix timers.
- It might also to security issues if SIGSETXID is masked and set*id
functions are called (some threads might have effective user or group
id different from the rest).
The changes are basically:
- Change __is_internal_signal to bool and used on all signal function
that has a signal number as input. Also for signal function which accepts
signals sets (sigset_t) it assumes that canonical function were used to
add/remove signals which lead to some input simplification.
- Fix tst-sigset.c to avoid check for SIGCANCEL/SIGTIMER and SIGSETXID.
It is rewritten to check each signal indidually and to check realtime
signals using canonical macros.
- Add generic __clear_internal_signals and __is_internal_signal
version since both symbols are used on generic implementations.
- Remove superflous sysdeps/nptl/sigfillset.c.
- Remove superflous SIGTIMER handling on Linux __is_internal_signal
since it is the same of SIGCANCEL.
- Remove dangling define and obvious comment on nptl/sigaction.c.
Checked on x86_64-linux-gnu.
[BZ #22391]
* nptl/sigaction.c (__sigaction): Use __is_internal_signal to
check for internal nptl signals.
* nptl/sigaction.c (__sigaction): Likewise.
* signal/sigaddset.c (sigaddset): Likewise.
* signal/sigdelset.c (sigdelset): Likewise.
* sysdeps/posix/signal.c (__bsd_signal): Likewise.
* sysdeps/posix/sigset.c (sigset): Call and check sigaddset return
value.
* signal/sigfillset.c (sigfillset): User __clear_internal_signals
to filter out internal nptl signals.
* signal/tst-sigset.c (do_test): Check ech signal indidually and
also check realtime signals using standard macros.
* sysdeps/generic/internal-signals.h (__clear_internal_signals,
__is_internal_signal, __libc_signal_block_all,
__libc_signal_block_app, __libc_signal_restore_set): New functions.
* sysdeps/nptl/sigfillset.c: Remove file.
* sysdeps/unix/sysv/linux/internal-signals.h (__is_internal_signal):
Change return to bool.
(__clear_internal_signals): Remove SIGTIMER clean since it is
equal to SIGCANEL on Linux.
* sysdeps/unix/sysv/linux/sigtimedwait.c (__sigtimedwait): Assume
signal set was constructed using standard functions.
Reported-by: Yury Norov <ynorov@caviumnetworks.com>
Diffstat (limited to 'sysdeps/generic')
-rw-r--r-- | sysdeps/generic/internal-signals.h | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/sysdeps/generic/internal-signals.h b/sysdeps/generic/internal-signals.h index 01e5b75b6b..17ed48c5bf 100644 --- a/sysdeps/generic/internal-signals.h +++ b/sysdeps/generic/internal-signals.h @@ -15,3 +15,39 @@ You should have received a copy of the GNU Lesser General Public License along with the GNU C Library; if not, see <http://www.gnu.org/licenses/>. */ + +#ifndef __INTERNAL_SIGNALS_H +# define __INTERNAL_SIGNALS_H + +static inline bool +__is_internal_signal (int sig) +{ + return false; +} + +static inline void +__clear_internal_signals (sigset_t *set) +{ +} + +static inline int +__libc_signal_block_all (sigset_t *set) +{ + return 0; +} + +static inline int +__libc_signal_block_app (sigset_t *set) +{ + return 0; +} + +/* Restore current process signal mask. */ +static inline int +__libc_signal_restore_set (const sigset_t *set) +{ + return 0; +} + + +#endif /* __INTERNAL_SIGNALS_H */ |