[PATCH][BZ #14782] Do not enable asynchronous cancelation in system
Ondřej Bílka
neleai@seznam.cz
Sun Jan 12 19:09:00 GMT 2014
On Sun, Jan 12, 2014 at 12:37:59PM -0500, Carlos O'Donell wrote:
> On 01/12/2014 10:28 AM, Rich Felker wrote:
> > On Sun, Jan 12, 2014 at 01:13:10PM +0100, OndÅej BÃlka wrote:
> >> Hi,
> >>
> >> When looking bugs another relatively easy one is that we do not need to
> >> enable async cancellation in system.
> >>
> >> We use cancellation to kill child process and we do not need enable
> >> cancellation until we install handlers to kill a child process. A
> >> cancellation needs to be only enabled in waidpid which already does
> >> that.
>
> This is not quite correct.
>
> The child process won't be killed via cancellation (ignore bug 14744 for
> now) because it's another process not a thread.
>
> We don't use any cancellation to kill the child. The parent is the one
> which we want to cancel.
>
> The child won't install the SIGCANCEL handler until it runs
> __pthread_initialize_minimal_internal which may be never if it's not
> MT.
>
> You are correct in that waitpid is a cancellation point and will check
> to see if this thread was the target of a cancellation request and
> cancel the thread before the function returns.
>
> Hopefully that clarifies things for you. If you have any questions about
> cancellation please ask them. It's a big mess right now in glibc, and
> I'm happy to share what I know.
>
Carlos a cancellation handler in sysdeps/unix/sysv/linux/system.c is
/* The cancellation handler. */
static void
cancel_handler (void *arg)
{
pid_t child = *(pid_t *) arg;
INTERNAL_SYSCALL_DECL (err);
INTERNAL_SYSCALL (kill, err, 2, child, SIGKILL);
TEMP_FAILURE_RETRY (__waitpid (child, NULL, 0));
How this code does not kill child?
More information about the Libc-alpha
mailing list