diff options
-rw-r--r-- | hurd/sigunwind.c | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/hurd/sigunwind.c b/hurd/sigunwind.c index 23309fd0d7..f6d29e1ab0 100644 --- a/hurd/sigunwind.c +++ b/hurd/sigunwind.c @@ -1,5 +1,5 @@ /* 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. 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 *) __hurd_threadvar_location (_HURD_THREADVAR_MIG_REPLY); 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; } |