summaryrefslogtreecommitdiff
path: root/arch/i386
diff options
context:
space:
mode:
authorAndi Kleen <ak@suse.de>2007-02-17 13:33:00 +0100
committerGreg Kroah-Hartman <gregkh@suse.de>2007-03-09 10:50:22 -0800
commit84cb9c519287d8bfeafbc060bd5cf4f25dfc9eb8 (patch)
tree772074b45deb084f557746537c7ea7f4d86fd308 /arch/i386
parent4c1a0698326b3eb9e4967fc91a919bbe5a36ed86 (diff)
x86: Don't require the vDSO for handling a.out signals
x86: Don't require the vDSO for handling a.out signals and in other strange binfmts. vDSO is not necessarily mapped there. This fixes signals in a.out programs Signed-off-by: Andi Kleen <ak@suse.de> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'arch/i386')
-rw-r--r--arch/i386/kernel/signal.c6
1 files changed, 5 insertions, 1 deletions
diff --git a/arch/i386/kernel/signal.c b/arch/i386/kernel/signal.c
index 65d7620eaa09..f654505bf54d 100644
--- a/arch/i386/kernel/signal.c
+++ b/arch/i386/kernel/signal.c
@@ -21,6 +21,7 @@
#include <linux/suspend.h>
#include <linux/ptrace.h>
#include <linux/elf.h>
+#include <linux/binfmts.h>
#include <asm/processor.h>
#include <asm/ucontext.h>
#include <asm/uaccess.h>
@@ -349,7 +350,10 @@ static int setup_frame(int sig, struct k_sigaction *ka,
goto give_sigsegv;
}
- restorer = (void *)VDSO_SYM(&__kernel_sigreturn);
+ if (current->binfmt->hasvdso)
+ restorer = (void *)VDSO_SYM(&__kernel_sigreturn);
+ else
+ restorer = (void *)&frame->retcode;
if (ka->sa.sa_flags & SA_RESTORER)
restorer = ka->sa.sa_restorer;