glibc/hurd/sigunwind.c
Ulrich Drepper 7ce241a03e Update.
1998-07-31 17:59  Ulrich Drepper  <drepper@cygnus.com>

	* sysdeps/generic/bits/byteswap.h: Fix problems with side effects.

	* manual/filesys.texi: Document truncate and ftruncate.
	Patch by Michael Deutschmann <michael@talamasca.wkpowerlink.com>.

	* shadow/putspent.c: Lock stream while generating the output.

	* sunrpc/clnt_unix.c: Use ucred instead of cmsgcred again.
	(__msgwrite): Rewrite accordingly.
	* sunrpc/svc_unix.c: Likewise.
	* sysdeps/unix/sysv/linux/Dist: Remove __recvmsg.S and __sendmsg.S.
	* sysdeps/unix/sysv/linux/Makefile [$(subdir)==socket]
	(sysdep_routines): Remove __sendmsg and __recvmsg.
	* sysdeps/unix/sysv/linux/__recvmsg.S: Removed.
	* sysdeps/unix/sysv/linux/__sendmsg.S: Removed.
	* sysdeps/unix/sysv/linux/recvmsg.c: Removed.
	* sysdeps/unix/sysv/linux/sendmsg.c: Removed.
	* sysdeps/unix/sysv/linux/recvmsg.S: New file.
	* sysdeps/unix/sysv/linux/sendmsg.S: New file.
	* sysdeps/unix/sysv/linux/bits/socket.h: Define SCM_CREDENTIALS and
	struct ucred.  Remove struct cmsgcred.
	Patches by Thorsten Kukuk.

1998-08-03  Andreas Jaeger  <aj@arthur.rhein-neckar.de>

	* inet/rcmd.c (__ivaliduser): Allow '#' as comment character.

1998-08-08 14:42  Ulrich Drepper  <drepper@cygnus.com>

	* argp/argp-help.c: Prepare to be used outside glibc without gcc by
	adding usual alloca cruft.
	Reported by Eleftherios Gkioulekas <lf@amath.washington.edu>.

1998-04-05  Jim Meyering  <meyering@ascend.com>

	* lib/regex.c (WIDE_CHAR_SUPPORT): Define.
	This now depends on HAVE_BTOWC so systems that lack btowc (like
	solaris-2.5.1) don't lose.

1998-08-07  Mark Kettenis  <kettenis@phys.uva.nl>

	* sysdeps/generic/bits/sigaction.h: Remove definition of SA_DISABLE.
	* sysdeps/generic/bits/sigstack.h: Define SS_DISABLE, SS_ONSTACK,
	MINSIGSTKZ and SIGSTKSZ.  Definitions match BSD.
	* hurd/sigunwind.c (_hurdsig_longjmp_from_handler): Use SS_ONSTACK
	instead of SA_ONSTACK.
	* sysdeps/mach/hurd/sigaltstack.c (__sigaltstack): Renamed from
	sigaltstack, and created a weak alias.  Use SS_DISABLE and
	SS_ONSTACK instead of SA_DISABLE and SA_ONSTACK.
	* sysdeps/mach/hurd/sigstack.c (sigstack): Use SS_ONSTACK instead
	of SA_ONSTACK.  Call __sigaltstack instead of sigaltstack.
	* sysdeps/mach/hurd/i386/sigreturn.c (__sigreturn): Use SS_ONSTACK
	instead of SA_ONSTACK.
	* sysdeps/mach/hurd/alpha/sigreturn.c (__sigreturn): Likewise.
	* sysdeps/mach/hurd/mips/sigreturn.c (__sigreturn): Likewise.
	* sysdeps/mach/hurd/i386/trampoline.c (_hurd_setup_sighandler):
	Use SS_DISABLE instead of SA_DISABLE.  Use SS_ONSTACK instead of
	SA_ONSTACK where appropriate.
	* sysdeps/mach/hurd/alpha/trampoline.c (_hurd_setup_sighandler):
	Likewise.
	* sysdeps/mach/hurd/hppa/trampoline.c (_hurd_setup_sighandler):
	Likewise.
	* sysdeps/mach/hurd/mips/trampoline.c (_hurd_setup_sighandler):
	Likewise.
	* manual/signal.texi (Signal Stack): Talk about SS_DISABLE and
	SS_ONSTACK instead of SA_DISABLE and SA_ONSTACK in discussion of
	the `ss_flags' member of `struct sigaltstack'.

1998-08-05  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* libio/Makefile (routines) [$(versioning)=yes]: Add oldtmpfile.
	(shared-only-routines): Likewise.
	* libio/oldtmpfile.c: New file
	* stdio-common/tmpfile.c: Use __fdopen and __close.
	[USE_IN_LIBIO]: Use _IO_fdopen instead of _IO_new_fdopen.  Put
	tmpfile on symbol version GLIBC_2.1.
	* stdio-common/tmpfile64.c: Use __fdopen and __close.
	[USE_IN_LIBIO]: Use _IO_fdopen instead of _IO_new_fdopen.
	* stdio-common/Version [GLIBC_2.1]: Add tmpfile.
	* stdio-common/tempnam.c: Use __strdup instead of strdup.
	* sysdeps/posix/fdopen.c: Define __fdopen and make fdopen weak
	alias.
	* sysdeps/generic/fdopen.c: Likewise.
	* sysdeps/mach/hurd/fdopen.c: Likewise.
	* stdio/stdio.h: Declare __fdopen.
	* sunrpc/openchild.c: Use __fdopen instead of fdopen.
	[USE_IN_LIBIO]: Map __fdopen to _IO_fdopen.
	* sysdeps/posix/tempname.c (__gen_tempname): Don't bother checking
	__stub_open64, it is never defined.

1998-08-05  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* libio/iofopen64.c: Fix typo.  Avoid unnessary casts.
	* libio/iopopen.c: Unlink file before freeing it if command
	creation failed.  Avoid unnessary casts.
	* libio/iofdopen.c:  Avoid unnecessary cast.
	* pwd/fgetpwent_r.c [USE_IN_LIBIO]: Map funlockfile to
	_IO_funlockfile.
	* pwd/fgetspent_r.c [USE_IN_LIBIO]: Likewise.

1998-08-06  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* grp/grp.h, pwd/pwd.h: Don't declare __grpopen, __grpread,
	__grpalloc, __grpscan and the corresponding pwd functions, they
	were removed long ago.

1998-08-06  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* math/libm-test.c (csqrt_test): Adjust epsilons.
	(casinh_test): Likewise.

1998-08-06  Andreas Schwab  <schwab@issan.informatik.uni-dortmund.de>

	* posix/globtest.sh: Fix typo.  Remove second test output file.

1998-08-07  Cristian Gafton  <gafton@redhat.com>

	* pwd/putpwent.c (putpwent): Avoid writting (none) in the passwd file.
	* shadow/putspent.c (putspent): Likewise.
	* grp/putgrent.c: New file.
	* grp/Makefile (routines): Add putgrent.
	* grp/Versions [GLIBC_2.1]: Add putgrent.
	* grp/grp.h: Add putgrent prototype.

1998-08-04 19:33  Ulrich Drepper  <drepper@cygnus.com>

	* elf/elf.h: More ELF definitions.
1998-08-08 20:02:34 +00:00

141 lines
5.5 KiB
C

/* longjmp cleanup function for unwinding past signal handlers.
Copyright (C) 1995, 1996, 1997, 1998 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
modify it under the terms of the GNU Library General Public License as
published by the Free Software Foundation; either version 2 of the
License, or (at your option) any later version.
The GNU C Library is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Library General Public License for more details.
You should have received a copy of the GNU Library General Public
License along with the GNU C Library; see the file COPYING.LIB. If not,
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
#include <hurd.h>
#include "thread_state.h"
#include <setjmp.h>
#include <assert.h>
/* _hurd_setup_sighandler puts a link on the `active resources' chain so that
_longjmp_unwind will call this function with the `struct sigcontext *'
describing the context interrupted by the signal, when `longjmp' is jumping
to an environment that unwinds past the interrupted frame. */
void
_hurdsig_longjmp_from_handler (void *data, jmp_buf env, int val)
{
struct sigcontext *scp = data;
struct hurd_sigstate *ss = _hurd_self_sigstate ();
int onstack;
inline void cleanup (void)
{
/* Destroy the MiG reply port used by the signal handler, and restore
the reply port in use by the thread when interrupted. */
mach_port_t *reply_port =
(mach_port_t *) __hurd_threadvar_location (_HURD_THREADVAR_MIG_REPLY);
if (*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;
}
__spin_lock (&ss->lock);
/* We should only ever be called from _longjmp_unwind (in jmp-unwind.c),
which calls us inside a critical section. */
assert (__spin_lock_locked (&ss->critical_section_lock));
/* Are we on the alternate signal stack now? */
onstack = (ss->sigaltstack.ss_flags & SS_ONSTACK);
__spin_unlock (&ss->lock);
if (onstack && ! scp->sc_onstack)
{
/* We are unwinding off the signal stack. We must use sigreturn to
do it robustly. Mutate the sigcontext so that when sigreturn
resumes from that context, it will be as if `__longjmp (ENV, VAL)'
were done. */
struct hurd_userlink *link;
/* Continue _longjmp_unwind's job of running the unwind
forms for frames being unwound, since we will not
return to its loop like this one, which called us. */
for (link = ss->active_resources;
link && _JMPBUF_UNWINDS (env[0].__jmpbuf, link);
link = link->thread.next)
if (_hurd_userlink_unlink (link))
{
if (link->cleanup == &_hurdsig_longjmp_from_handler)
{
/* We are unwinding past another signal handler invocation.
Just finish the cleanup for this (inner) one, and then
swap SCP to restore to the outer context. */
cleanup ();
scp = link->cleanup_data;
}
else
(*link->cleanup) (link->cleanup_data, env, val);
}
#define sc_machine_thread_state paste(sc_,machine_thread_state)
#define paste(a,b) paste1(a,b)
#define paste1(a,b) a##b
/* There are no more unwind forms to be run!
Now we can just have the sigreturn do the longjmp for us. */
_hurd_longjmp_thread_state
((struct machine_thread_state *) &scp->sc_machine_thread_state,
env, val);
/* Restore to the same current signal mask. If sigsetjmp saved the
mask, longjmp has already restored it as desired; if not, we
should leave it as it is. */
scp->sc_mask = ss->blocked;
/* sigreturn expects the link added by _hurd_setup_sighandler
to still be there, but _longjmp_unwind removed it just before
calling us. Put it back now so sigreturn can find it. */
link = (void *) &scp[1];
assert (! link->resource.next && ! link->resource.prevp);
assert (link->thread.next == ss->active_resources);
assert (link->thread.prevp = &ss->active_resources);
if (link->thread.next)
link->thread.next->thread.prevp = &link->thread.next;
ss->active_resources = link;
/* We must momentarily exit the critical section so that sigreturn
does not get upset with us. But we don't want signal handlers
running right now, because we are presently in the bogus state of
having run all the unwind forms back to ENV's frame, but our SP is
still inside those unwound frames. */
__spin_lock (&ss->lock);
__spin_unlock (&ss->critical_section_lock);
ss->blocked = ~(sigset_t) 0 & ~_SIG_CANT_MASK;
__spin_unlock (&ss->lock);
/* Restore to the modified signal context that now
performs `longjmp (ENV, VAL)'. */
__sigreturn (scp);
assert (! "sigreturn returned!");
}
/* We are not unwinding off the alternate signal stack. So nothing
really funny is going on here. We can just clean up this handler
frame and let _longjmp_unwind continue unwinding. */
cleanup ();
ss->intr_port = scp->sc_intr_port;
}