[PATCH] nptl: Disable asynchronous cancellation on __do_cancel (BZ 32782)

Florian Weimer fweimer@redhat.com
Wed Mar 12 16:51:54 GMT 2025


* Adhemerval Zanella:

> Similar to __pthread_unwind, called from pthread_exit, once cancellation
> starts the cancellation signal handler (sigcancel_handler) should not
> restart the cancellation process (and libgcc unwind is not reentrant).
> So also disables asynchronous cancellation on __do_cancel, any
> cancellation signal received after it is ignored (cancel_async_enabled
> will return false).

Does this change bring back the previous behavior (in that further
attempts to cancel are ignored)?

> diff --git a/sysdeps/nptl/pthreadP.h b/sysdeps/nptl/pthreadP.h
> index 2d620ed20d..63de8904f4 100644
> --- a/sysdeps/nptl/pthreadP.h
> +++ b/sysdeps/nptl/pthreadP.h
> @@ -267,8 +267,16 @@ __do_cancel (void *result)
>  
>    self->result = result;
>  
> -  /* Make sure we get no more cancellations.  */
> -  atomic_fetch_or_relaxed (&self->cancelhandling, EXITING_BITMASK);
> +  /* Disable asynchronous cancellation and signal that thread is exiting.  */
> +  int cancelhandling = atomic_load_relaxed (&self->cancelhandling);
> +  int newval;
> +   do
> +     {
> +       newval = (cancelhandling & ~CANCELTYPE_BITMASK) | EXITING_BITMASK;
> +     }
> +   while (!atomic_compare_exchange_weak_acquire (&self->cancelhandling,
> +                                                 &cancelhandling,
> +                                                 newval));

Unecessary extra braces.

The cause and nature of the change match my expectations, I merely
wonder how the behavior compares to glibc before your cancellation fix
was applied.

> diff --git a/sysdeps/pthread/tst-cancel32.c b/sysdeps/pthread/tst-cancel32.c
> new file mode 100644
> index 0000000000..1c6a4d8f47
> --- /dev/null
> +++ b/sysdeps/pthread/tst-cancel32.c

> +static void *
> +tf (void *closure)
> +{
> +  pthread_cleanup_push (tf_cleanup, NULL);
> +  for (;;)
> +    {
> +      /* The only failure possible for pthread_setcanceltype is and

Typo: is an[]

Thanks,
Florian



More information about the Libc-alpha mailing list