mirror of git://sourceware.org/git/glibc.git
(_hurdsig_longjmp_from_handler): Store MACH_PORT_DEAD in the thread reply-port variable before destroying the signal handler's reply port, to avoid infinite recursion.
This commit is contained in:
parent
b84095feb4
commit
574ce5e4e4
|
|
@ -1,5 +1,5 @@
|
||||||
/* longjmp cleanup function for unwinding past signal handlers.
|
/* longjmp cleanup function for unwinding past signal handlers.
|
||||||
Copyright (C) 1995 Free Software Foundation, Inc.
|
Copyright (C) 1995, 1996 Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
|
@ -41,7 +41,15 @@ _hurdsig_longjmp_from_handler (void *data, jmp_buf env, int val)
|
||||||
mach_port_t *reply_port =
|
mach_port_t *reply_port =
|
||||||
(mach_port_t *) __hurd_threadvar_location (_HURD_THREADVAR_MIG_REPLY);
|
(mach_port_t *) __hurd_threadvar_location (_HURD_THREADVAR_MIG_REPLY);
|
||||||
if (*reply_port)
|
if (*reply_port)
|
||||||
__mach_port_destroy (__mach_task_self (), *reply_port);
|
{
|
||||||
|
mach_port_t port = *reply_port;
|
||||||
|
/* Assigning MACH_PORT_DEAD here tells libc's mig_get_reply_port
|
||||||
|
not to get another reply port, but avoids mig_dealloc_reply_port
|
||||||
|
trying to deallocate it after the receive fails (which it will,
|
||||||
|
because the reply port will be bogus, regardless). */
|
||||||
|
*reply_port = MACH_PORT_DEAD;
|
||||||
|
__mach_port_destroy (__mach_task_self (), port);
|
||||||
|
}
|
||||||
*reply_port = scp->sc_reply_port;
|
*reply_port = scp->sc_reply_port;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue