From 574ce5e4e4460174369ccc765502934058eb3636 Mon Sep 17 00:00:00 2001 From: Miles Bader Date: Wed, 10 Apr 1996 18:36:02 +0000 Subject: (_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. --- hurd/sigunwind.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) (limited to 'hurd') 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; } -- cgit v1.2.3