summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@home.transmeta.com>2003-01-11 16:50:14 -0800
committerLinus Torvalds <torvalds@home.transmeta.com>2003-01-11 16:50:14 -0800
commit2bcdebe4e596eb1642e945ef8fbc705b919ad60c (patch)
tree536508fd9a7b968097cbcd0a4af4be5eb88d9515
parentd5a9a399cb155b910469abfc2e3dd9d49699054c (diff)
Re-instate the SA_RESTORER functionality, since it seems that some
programs still depend on it and in fact do install a different signal restorer than the standard kernel version.
-rw-r--r--arch/i386/kernel/signal.c13
1 files changed, 11 insertions, 2 deletions
diff --git a/arch/i386/kernel/signal.c b/arch/i386/kernel/signal.c
index 56a0af099074..42160fc0322d 100644
--- a/arch/i386/kernel/signal.c
+++ b/arch/i386/kernel/signal.c
@@ -350,6 +350,7 @@ get_sigframe(struct k_sigaction *ka, struct pt_regs * regs, size_t frame_size)
static void setup_frame(int sig, struct k_sigaction *ka,
sigset_t *set, struct pt_regs * regs)
{
+ void *restorer;
struct sigframe *frame;
int err = 0;
@@ -378,8 +379,12 @@ static void setup_frame(int sig, struct k_sigaction *ka,
if (err)
goto give_sigsegv;
+ restorer = (void *) (fix_to_virt(FIX_VSYSCALL) + 32);
+ if (ka->sa.sa_flags & SA_RESTORER)
+ restorer = ka->sa.sa_restorer;
+
/* Set up to return from userspace. */
- err |= __put_user(fix_to_virt(FIX_VSYSCALL) + 32, &frame->pretcode);
+ err |= __put_user(restorer, &frame->pretcode);
/*
* This is popl %eax ; movl $,%eax ; int $0x80
@@ -422,6 +427,7 @@ give_sigsegv:
static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
sigset_t *set, struct pt_regs * regs)
{
+ void *restorer;
struct rt_sigframe *frame;
int err = 0;
@@ -456,7 +462,10 @@ static void setup_rt_frame(int sig, struct k_sigaction *ka, siginfo_t *info,
goto give_sigsegv;
/* Set up to return from userspace. */
- err |= __put_user(fix_to_virt(FIX_VSYSCALL) + 64, &frame->pretcode);
+ restorer = (void *) (fix_to_virt(FIX_VSYSCALL) + 64);
+ if (ka->sa.sa_flags & SA_RESTORER)
+ restorer = ka->sa.sa_restorer;
+ err |= __put_user(restorer, &frame->pretcode);
/*
* This is movl $,%eax ; int $0x80