[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