From: Adhemerval Zanella Date: Thu, 11 Dec 2025 20:47:17 +0000 (-0300) Subject: nptl: Use __futex_abstimed_wait64 on pthread_create (BZ 33715) X-Git-Tag: glibc-2.43~75 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0d5f77cd3a8fe9ad7fbc8071f956c4f5d93677b7;p=thirdparty%2Fglibc.git nptl: Use __futex_abstimed_wait64 on pthread_create (BZ 33715) The pthread_create is annotated as __THROWNL. Checked on x86_64-linux-gnu. Suggested-by: Florian Weimer Reviewed-by: Florian Weimer --- diff --git a/nptl/Makefile b/nptl/Makefile index 81d6a5482c..bfce63427b 100644 --- a/nptl/Makefile +++ b/nptl/Makefile @@ -277,6 +277,7 @@ tests = \ tst-cancel17 \ tst-cancel24 \ tst-cancel31 \ + tst-cancel33 \ tst-cond26 \ tst-context1 \ tst-default-attr \ diff --git a/nptl/pthread_create.c b/nptl/pthread_create.c index 19e4ec8064..08a67ebd81 100644 --- a/nptl/pthread_create.c +++ b/nptl/pthread_create.c @@ -867,8 +867,8 @@ __pthread_create_2_1 (pthread_t *newthread, const pthread_attr_t *attr, startup there is no need to handle all the steps. */ pid_t tid; while ((tid = atomic_load_acquire (&pd->tid)) != 0) - __futex_abstimed_wait_cancelable64 ((unsigned int *) &pd->tid, - tid, 0, NULL, LLL_SHARED); + __futex_abstimed_wait64 ((unsigned int *) &pd->tid, tid, 0, NULL, + LLL_SHARED); } /* State (c) or (d) and we have ownership of PD (see CONCURRENCY diff --git a/nptl/tst-cancel33.c b/nptl/tst-cancel33.c new file mode 100644 index 0000000000..3a736d18df --- /dev/null +++ b/nptl/tst-cancel33.c @@ -0,0 +1,79 @@ +/* Check if pthread_create does not act as cancellation entrypoint (BZ 33715) + Copyright (C) 2025 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 + . */ + +#include +#include +#include +#include +#include + +static pthread_barrier_t b; + +static void * +thr_func2 (void *arg) +{ + abort (); + return NULL; +} + +static void * +thr_func1 (void *closure) +{ + int max_cpu = xsysconf (_SC_NPROCESSORS_CONF) + 1; + /* Set a affinity mask with an invalid CPU. */ + cpu_set_t *cpuset = CPU_ALLOC (max_cpu); + TEST_VERIFY_EXIT (cpuset != NULL); + size_t cpusetsize = CPU_ALLOC_SIZE (max_cpu); + CPU_ZERO_S (cpusetsize, cpuset); + CPU_SET_S (max_cpu, cpusetsize, cpuset); + + /* Check if the affinity mask does trigger an error. */ + TEST_COMPARE (sched_setaffinity (0, cpusetsize, cpuset), -1); + TEST_COMPARE (errno, EINVAL); + + pthread_attr_t attr; + xpthread_attr_init (&attr); + xpthread_attr_setaffinity_np (&attr, cpusetsize, cpuset); + + xpthread_barrier_wait (&b); + + pthread_t thr; + TEST_COMPARE (pthread_create (&thr, &attr, thr_func2, NULL), EINVAL); + xpthread_attr_destroy (&attr); + + return NULL; +} + +static int +do_test (void) +{ + xpthread_barrier_init (&b, NULL, 2); + + pthread_t thr = xpthread_create (NULL, thr_func1, NULL); + + xpthread_cancel (thr); + + xpthread_barrier_wait (&b); + + void *r = xpthread_join (thr); + TEST_VERIFY_EXIT (r == NULL); + + return 0; +} + +#include