diff options
author | Florian Weimer <fweimer@redhat.com> | 2021-09-13 11:06:08 +0200 |
---|---|---|
committer | Florian Weimer <fweimer@redhat.com> | 2021-09-13 11:06:08 +0200 |
commit | 8af8456004edbab71f8903a60a3cae442cf6fe69 (patch) | |
tree | 735e5c4cb622683727395fd9ec345788597c44a2 /sysdeps/pthread/tst-pthread_kill-exited.c | |
parent | 2fd36391be523e882f2d102063710d3cf7ee7fa8 (diff) | |
download | glibc-8af8456004edbab71f8903a60a3cae442cf6fe69.tar.gz glibc-8af8456004edbab71f8903a60a3cae442cf6fe69.tar.xz glibc-8af8456004edbab71f8903a60a3cae442cf6fe69.zip |
nptl: pthread_kill, pthread_cancel should not fail after exit (bug 19193)
This closes one remaining race condition related to bug 12889: if the thread already exited on the kernel side, returning ESRCH is not correct because that error is reserved for the thread IDs (pthread_t values) whose lifetime has ended. In case of a kernel-side exit and a valid thread ID, no signal needs to be sent and cancellation does not have an effect, so just return 0. sysdeps/pthread/tst-kill4.c triggers undefined behavior and is removed with this commit. Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
Diffstat (limited to 'sysdeps/pthread/tst-pthread_kill-exited.c')
-rw-r--r-- | sysdeps/pthread/tst-pthread_kill-exited.c | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/sysdeps/pthread/tst-pthread_kill-exited.c b/sysdeps/pthread/tst-pthread_kill-exited.c new file mode 100644 index 0000000000..7575fb6d58 --- /dev/null +++ b/sysdeps/pthread/tst-pthread_kill-exited.c @@ -0,0 +1,46 @@ +/* Test that pthread_kill succeeds for an exited thread. + Copyright (C) 2021 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 + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. + + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + <https://www.gnu.org/licenses/>. */ + +/* This test verifies that pthread_kill returns 0 (and not ESRCH) for + a thread that has exited on the kernel side. */ + +#include <signal.h> +#include <stddef.h> +#include <support/support.h> +#include <support/xthread.h> + +static void * +noop_thread (void *closure) +{ + return NULL; +} + +static int +do_test (void) +{ + pthread_t thr = xpthread_create (NULL, noop_thread, NULL); + + support_wait_for_thread_exit (); + + xpthread_kill (thr, SIGUSR1); + xpthread_join (thr); + + return 0; +} + +#include <support/test-driver.c> |