glibc/sysdeps/pthread
Adhemerval Zanella 290db09546 nptl: Handle spurious EINTR when thread cancellation is disabled (BZ#29029)
Some Linux interfaces never restart after being interrupted by a signal
handler, regardless of the use of SA_RESTART [1].  It means that for
pthread cancellation, if the target thread disables cancellation with
pthread_setcancelstate and calls such interfaces (like poll or select),
it should not see spurious EINTR failures due the internal SIGCANCEL.

However recent changes made pthread_cancel to always sent the internal
signal, regardless of the target thread cancellation status or type.
To fix it, the previous semantic is restored, where the cancel signal
is only sent if the target thread has cancelation enabled in
asynchronous mode.

The cancel state and cancel type is moved back to cancelhandling
and atomic operation are used to synchronize between threads.  The
patch essentially revert the following commits:

  8c1c0aae20 nptl: Move cancel type out of cancelhandling
  2b51742531 nptl: Move cancel state out of cancelhandling
  26cfbb7162 nptl: Remove CANCELING_BITMASK

However I changed the atomic operation to follow the internal C11
semantic and removed the MACRO usage, it simplifies a bit the
resulting code (and removes another usage of the old atomic macros).

Checked on x86_64-linux-gnu, i686-linux-gnu, aarch64-linux-gnu,
and powerpc64-linux-gnu.

[1] https://man7.org/linux/man-pages/man7/signal.7.html

Reviewed-by: Florian Weimer <fweimer@redhat.com>
Tested-by: Aurelien Jarno <aurelien@aurel32.net>

(cherry-picked from commit 404656009b)
2022-04-15 09:52:54 -03:00
..
bits
allocalim.h
call_once.c nptl: Move call_once into libc 2021-05-03 08:14:01 +02:00
cnd_broadcast.c nptl: Move cnd_broadcast into libc 2021-05-03 08:14:17 +02:00
cnd_destroy.c nptl: Move cnd_destroy into libc 2021-05-03 08:14:28 +02:00
cnd_init.c nptl: Move cnd_init into libc 2021-05-03 08:14:38 +02:00
cnd_signal.c nptl: Move cnd_signal into libc 2021-05-03 08:14:49 +02:00
cnd_timedwait.c
cnd_wait.c nptl: Move cnd_wait into libc 2021-05-03 08:15:10 +02:00
eintr.c
elision-conf.h nptl: Move elision implementations into libc 2021-02-23 14:59:34 +01:00
Makeconfig
Makefile nptl: Handle spurious EINTR when thread cancellation is disabled (BZ#29029) 2022-04-15 09:52:54 -03:00
mtx_destroy.c nptl: Move mtx_destroy into libc 2021-05-03 08:15:15 +02:00
mtx_init.c nptl: Move mtx_init into libc 2021-05-03 08:15:22 +02:00
mtx_lock.c nptl: Move mtx_lock into libc 2021-05-03 08:15:41 +02:00
mtx_timedlock.c
mtx_trylock.c nptl: Move mtx_trylock into libc 2021-05-03 08:15:58 +02:00
mtx_unlock.c nptl: Move mtx_unlock into libc 2021-05-03 08:16:48 +02:00
posix-timer.h
pthread_atfork_compat.c Consolidate pthread_atfork 2021-06-24 10:04:41 -03:00
pthread_atfork.c Consolidate pthread_atfork 2021-06-24 10:04:41 -03:00
pthread_early_init.h pthread: Introduce __pthread_early_init 2021-04-21 19:49:51 +02:00
pthread_mutex_conf.h nptl: Move internal symbol __mutex_aconf into libc 2021-04-21 19:49:51 +02:00
sem_close.c nptl: Move sem_close, sem_open into libc 2021-05-05 17:19:38 +02:00
sem_open.c nptl: Move sem_close, sem_open into libc 2021-05-05 17:19:38 +02:00
sem_routines.c nptl: Move sem_close, sem_open into libc 2021-05-05 17:19:38 +02:00
sem_routines.h
sem_unlink.c nptl: Move sem_unlink into libc 2021-05-05 17:19:50 +02:00
semaphore.h y2038: Add support for 64-bit time on legacy ABIs 2021-06-15 10:42:11 -03:00
thrd_create.c nptl: Move pthread_create, thrd_create into libc 2021-05-21 22:35:00 +02:00
thrd_detach.c nptl: Move pthread_detach, thrd_detach into libc 2021-05-11 11:24:39 +02:00
thrd_equal.c
thrd_exit.c nptl: Move thrd_exit into libc 2021-05-03 08:17:15 +02:00
thrd_join.c nptl: Move thread join functions into libc 2021-05-11 11:24:39 +02:00
thrd_priv.h
thrd_sleep.c
threads.h y2038: Add support for 64-bit time on legacy ABIs 2021-06-15 10:42:11 -03:00
tss_create.c nptl: Move tss_create into libc 2021-05-03 08:17:29 +02:00
tss_delete.c nptl: Move tss_delete into libc 2021-05-03 08:17:38 +02:00
tss_get.c nptl: Move tss_get into libc 2021-05-03 08:18:01 +02:00
tss_set.c nptl: Move tss_set into libc 2021-05-03 08:18:08 +02:00
tst-_res1.c
tst-_res1mod1.c
tst-_res1mod2.c
tst-abstime-time64.c y2038: Add test coverage 2021-06-15 10:42:11 -03:00
tst-abstime.c
tst-atfork1.c
tst-atfork2.c
tst-atfork2mod.c
tst-attr1.c
tst-backtrace1.c
tst-bad-schedattr.c
tst-barrier1.c
tst-barrier2.c
tst-barrier3.c
tst-barrier4.c
tst-basic1.c
tst-basic2.c
tst-basic3.c
tst-basic4.c
tst-basic5.c
tst-basic6.c
tst-basic7.c
tst-call-once.c
tst-cancel1.c
tst-cancel2.c
tst-cancel3.c
tst-cancel4-common.c
tst-cancel4-common.h
tst-cancel4.c
tst-cancel5.c
tst-cancel6.c
tst-cancel8.c
tst-cancel9.c
tst-cancel10.c
tst-cancel11.c
tst-cancel12.c
tst-cancel13.c
tst-cancel14.c
tst-cancel15.c
tst-cancel16.c
tst-cancel18.c
tst-cancel19.c
tst-cancel20.c
tst-cancel21-static.c
tst-cancel21.c
tst-cancel22.c
tst-cancel23.c
tst-cancel25.c
tst-cancel26.c
tst-cancel27.c
tst-cancel28.c pthread/tst-cancel28: Fix barrier re-init race condition 2021-12-14 10:07:27 +05:30
tst-cancel29.c nptl: Handle spurious EINTR when thread cancellation is disabled (BZ#29029) 2022-04-15 09:52:54 -03:00
tst-cancel-self-cancelstate.c
tst-cancel-self-canceltype.c
tst-cancel-self-cleanup.c
tst-cancel-self-testcancel.c
tst-cancel-self.c
tst-cancelx1.c
tst-cancelx2.c
tst-cancelx3.c
tst-cancelx4.c
tst-cancelx5.c
tst-cancelx6.c
tst-cancelx8.c
tst-cancelx9.c
tst-cancelx10.c
tst-cancelx11.c
tst-cancelx12.c
tst-cancelx13.c
tst-cancelx14.c
tst-cancelx15.c
tst-cancelx16.c
tst-cancelx18.c
tst-cancelx20.c
tst-cancelx21.c
tst-cleanup0.c
tst-cleanup0.expect
tst-cleanup1.c
tst-cleanup2.c
tst-cleanup3.c
tst-cleanupx0.c
tst-cleanupx0.expect
tst-cleanupx1.c
tst-cleanupx2.c
tst-cleanupx3.c
tst-clock1.c
tst-cnd-basic.c
tst-cnd-broadcast.c
tst-cnd-timedwait-time64.c y2038: Add test coverage 2021-06-15 10:42:11 -03:00
tst-cnd-timedwait.c
tst-cond1.c
tst-cond2.c
tst-cond3.c
tst-cond4.c
tst-cond5.c
tst-cond6.c
tst-cond7.c
tst-cond8-static.c
tst-cond8.c
tst-cond9.c
tst-cond10.c
tst-cond11-static.c
tst-cond11-time64.c y2038: Add test coverage 2021-06-15 10:42:11 -03:00
tst-cond11.c
tst-cond12.c
tst-cond13.c
tst-cond14.c
tst-cond15.c
tst-cond16.c
tst-cond17.c
tst-cond18.c
tst-cond19.c
tst-cond20.c
tst-cond21.c
tst-cond23.c
tst-cond24.c
tst-cond25.c
tst-cond27.c
tst-cond-except.c
tst-create1.c nptl: Add one more barrier to nptl/tst-create1 2021-12-10 11:56:06 +01:00
tst-create1mod.c elf: Avoid deadlock between pthread_create and ctors [BZ #28357] 2021-10-19 14:21:14 +02:00
tst-create-detached.c
tst-detach1.c
tst-eintr2.c
tst-eintr3.c
tst-eintr4.c
tst-eintr5.c
tst-exec1.c
tst-exec2.c
tst-exec3.c
tst-exit1.c
tst-exit2.c
tst-exit3.c
tst-fini1.c
tst-fini1mod.c
tst-flock1.c
tst-flock2.c
tst-fork1.c
tst-fork2.c
tst-fork3.c
tst-fork4.c
tst-getpid3.c
tst-join1.c
tst-join2.c
tst-join3.c
tst-join4.c
tst-join5.c
tst-join6.c
tst-join7.c
tst-join7mod.c
tst-join8.c
tst-join9.c
tst-join10.c
tst-join11.c
tst-join12.c
tst-join13.c
tst-join14-time64.c y2038: Add test coverage 2021-06-15 10:42:11 -03:00
tst-join14.c
tst-join15.c
tst-key1.c
tst-key2.c Pass a valid pointer to pthread_setspecific to avoid GCC 11 warning. 2021-04-27 19:07:49 -06:00
tst-key3.c Pass a valid pointer to pthread_setspecific to avoid GCC 11 warning. 2021-04-27 19:07:49 -06:00
tst-key4.c
tst-kill1.c
tst-kill2.c
tst-kill3.c
tst-kill5.c
tst-kill6.c
tst-locale1.c
tst-locale2.c
tst-memstream.c
tst-mtx-basic.c
tst-mtx-recursive.c
tst-mtx-timedlock-time64.c y2038: Add test coverage 2021-06-15 10:42:11 -03:00
tst-mtx-timedlock.c
tst-mtx-trylock.c
tst-mutex1.c
tst-mutex2.c
tst-mutex3.c
tst-mutex4.c
tst-mutex5.c
tst-mutex6.c
tst-mutex7.c
tst-mutex7robust.c
tst-mutex9.c
tst-mutex10.c
tst-mutex11.c
tst-mutex-errorcheck.c
tst-once1.c
tst-once2.c
tst-once3.c
tst-once4.c
tst-oncex3.c
tst-oncex4.c
tst-oncey3.c [PATCH] pthread_once hangs when init routine throws an exception [BZ #18435] 2021-03-04 15:15:33 +01:00
tst-oncey4.c [PATCH] pthread_once hangs when init routine throws an exception [BZ #18435] 2021-03-04 15:15:33 +01:00
tst-pt-align3.c
tst-pt-align.c
tst-pt-popen1.c
tst-pt-sysconf.c
tst-pt-tls1.c
tst-pt-tls2.c
tst-pt-tls4.c
tst-pt-vfork1.c
tst-pt-vfork2.c
tst-pthread_cancel-exited.c nptl: pthread_kill, pthread_cancel should not fail after exit (bug 19193) 2021-09-13 13:38:51 +02:00
tst-pthread_cancel-select-loop.c nptl: Fix race between pthread_kill and thread exit (bug 12889) 2021-09-13 13:38:51 +02:00
tst-pthread_kill-exited.c nptl: pthread_kill needs to return ESRCH for old programs (bug 19193) 2021-09-20 14:58:57 +02:00
tst-pthread_kill-exiting.c nptl: Fix race between pthread_kill and thread exit (bug 12889) 2021-09-13 13:38:51 +02:00
tst-pthread-exit-signal.c nptl: Do not set signal mask on second setjmp return [BZ #28607] 2021-11-24 09:22:10 +01:00
tst-pthread-mutexattr.c
tst-pthread-raise-blocked-self.c nptl: pthread_kill must send signals to a specific thread [BZ #28407] 2021-10-01 18:18:15 +02:00
tst-pthread-setuid-loop.c nptl: Avoid setxid deadlock with blocked signals in thread exit [BZ #28361] 2021-09-23 11:02:19 +02:00
tst-raise1.c
tst-robust1.c pthread: Use pthread_mutexattr_setrobust in tests 2021-04-23 09:51:57 +02:00
tst-robust2.c
tst-robust3.c
tst-robust4.c
tst-robust5.c
tst-robust6.c
tst-robust7.c pthread: Use pthread_mutexattr_setrobust in tests 2021-04-23 09:51:57 +02:00
tst-robust8.c pthread: Use pthread_mutexattr_setrobust in tests 2021-04-23 09:51:57 +02:00
tst-robust9.c pthread: Use pthread_mutexattr_setrobust in tests 2021-04-23 09:51:57 +02:00
tst-robust10.c pthread: Use pthread_mutexattr_setrobust in tests 2021-04-23 09:51:57 +02:00
tst-rwlock1.c
tst-rwlock4.c
tst-rwlock5.c
tst-rwlock12.c
tst-rwlock13.c
tst-rwlock14-time64.c y2038: Add test coverage 2021-06-15 10:42:11 -03:00
tst-rwlock14.c
tst-rwlock16.c
tst-rwlock-tryrdlock-stall.c
tst-rwlock-trywrlock-stall.c
tst-sem1.c
tst-sem2.c
tst-sem3.c
tst-sem4.c
tst-sem5-time64.c y2038: Add test coverage 2021-06-15 10:42:11 -03:00
tst-sem5.c
tst-sem6.c
tst-sem7.c
tst-sem8.c
tst-sem9.c
tst-sem10.c
tst-sem14.c
tst-sem15.c
tst-sem16.c
tst-setuid3.c
tst-signal1.c
tst-signal2.c
tst-signal4.c
tst-signal5.c
tst-signal6.c
tst-signal8.c
tst-spin1.c
tst-spin2.c
tst-spin3.c
tst-spin4.c
tst-stack1.c
tst-stdio1.c
tst-stdio2.c
tst-thrd-detach.c
tst-thrd-sleep-time64.c y2038: Add test coverage 2021-06-15 10:42:11 -03:00
tst-thrd-sleep.c
tst-timer.c
tst-tls4moda.c
tst-tls4modb.c
tst-tsd1.c Pass a valid pointer to pthread_setspecific to avoid GCC 11 warning. 2021-04-27 19:07:49 -06:00
tst-tsd2.c Pass a valid pointer to pthread_setspecific to avoid GCC 11 warning. 2021-04-27 19:07:49 -06:00
tst-tsd5.c Pass a valid pointer to pthread_setspecific to avoid GCC 11 warning. 2021-04-27 19:07:49 -06:00
tst-tsd6.c Pass a valid pointer to pthread_setspecific to avoid GCC 11 warning. 2021-04-27 19:07:49 -06:00
tst-tss-basic.c
tst-umask1.c
tst-unload.c
tst-unwind-thread.c
tst-vfork1x.c
tst-vfork2x.c