(_hurdsig_longjmp_from_handler): Store MACH_PORT_DEAD in the thread reply-port...
authorMiles Bader <miles@gnu.org>
Wed, 10 Apr 1996 18:36:02 +0000 (18:36 +0000)
committerMiles Bader <miles@gnu.org>
Wed, 10 Apr 1996 18:36:02 +0000 (18:36 +0000)
hurd/sigunwind.c

index 23309fd..f6d29e1 100644 (file)
@@ -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;
     }