On Sat, Jul 04, 1998 at 12:37:29AM +0200, Thomas Bogendoerfer wrote:
> On Fri, Jul 03, 1998 at 04:58:55PM +0200, ralf@uni-koblenz.de wrote:
> > Sigpause() is a libc routine in libc/sysdeps/posix/sigpause.c; it's either
> > using sigprocmask(2) or sigsuspend(2).
>
> it's sigsuspend. And after looking at scall_o32.S and realizing that
> calling do_signal() needs to have the static registers saved/restored,
> the bug is obvious (I also had a look at the Alpha sys_sigsuspend). Below
> is a patch, which fixes tcsh and other programs, which use sigsupend.
> If everybody agrees with the patch, I'll check it in.
I've checked in a slightly different patch. I already had to deal with
the problem of saving these registers for several other routines, so there
is an inline function named save_static to do that job. Also it saves us
some cycles and looks a bit more beautyful. Patch appended below.
Ralf
Index: arch/mips/kernel/signal.c
===================================================================
RCS file: /src/ftp/cvs/linux/arch/mips/kernel/signal.c,v
retrieving revision 1.12
diff -u -r1.12 signal.c
--- signal.c 1998/04/05 11:23:53 1.12
+++ signal.c 1998/07/03 23:04:42
@@ -43,6 +43,7 @@
{
sigset_t *uset, saveset, newset;
+ save_static(®s);
uset = (sigset_t *) regs.regs[4];
if (copy_from_user(&newset, uset, sizeof(sigset_t)))
return -EFAULT;
@@ -67,6 +68,7 @@
{
sigset_t *uset, saveset, newset;
+ save_static(®s);
uset = (sigset_t *) regs.regs[4];
if (copy_from_user(&newset, uset, sizeof(sigset_t)))
return -EFAULT;
|