aboutsummaryrefslogtreecommitdiffstats
path: root/arch/x86
diff options
context:
space:
mode:
authorRoland McGrath <roland@redhat.com>2008-04-09 04:29:27 -0400
committerIngo Molnar <mingo@elte.hu>2008-04-17 11:40:45 -0400
commit1a3e4ca41c5a38975023a6e8831c309d3322889c (patch)
tree83036829962928b992efa58f03e36de40db313e1 /arch/x86
parent85eb69a16aab5a394ce043c2131319eae35e6493 (diff)
x86 vDSO: don't use disabled vDSO for signal trampoline
If the vDSO was not mapped, don't use it as the "restorer" for a signal handler. Whether we have a pointer in mm->context.vdso depends on what happened at exec time, so we shouldn't check any global flags now. Background: Currently, every 32-bit exec gets the vDSO mapped even if it's disabled (the process just doesn't get told about it). Because it's in fact always there, the bug that this patch fixes cannot happen now. With the second patch, it won't be mapped at all when it's disabled, which is one of the things that people might really want when they disable it (so nothing they didn't ask for goes into their address space). The 32-bit signal handler setup when SA_RESTORER is not used refers to current->mm->context.vdso without regard to whether the vDSO has been disabled when the process was exec'd. This patch fixes this not to use it when it's null, which becomes possible after the second patch. (This never happens in normal use, because glibc's sigaction call uses SA_RESTORER unless glibc detected the vDSO.) Signed-off-by: Roland McGrath <roland@redhat.com> Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'arch/x86')
-rw-r--r--arch/x86/ia32/ia32_signal.c2
-rw-r--r--arch/x86/kernel/signal_32.c2
2 files changed, 2 insertions, 2 deletions
diff --git a/arch/x86/ia32/ia32_signal.c b/arch/x86/ia32/ia32_signal.c
index 5e7771a3ba2f..05e155d3fb6c 100644
--- a/arch/x86/ia32/ia32_signal.c
+++ b/arch/x86/ia32/ia32_signal.c
@@ -468,7 +468,7 @@ int ia32_setup_frame(int sig, struct k_sigaction *ka,
468 restorer = ka->sa.sa_restorer; 468 restorer = ka->sa.sa_restorer;
469 } else { 469 } else {
470 /* Return stub is in 32bit vsyscall page */ 470 /* Return stub is in 32bit vsyscall page */
471 if (current->binfmt->hasvdso) 471 if (current->mm->context.vdso)
472 restorer = VDSO32_SYMBOL(current->mm->context.vdso, 472 restorer = VDSO32_SYMBOL(current->mm->context.vdso,
473 sigreturn); 473 sigreturn);
474 else 474 else
diff --git a/arch/x86/kernel/signal_32.c b/arch/x86/kernel/signal_32.c
index 0157a6f0f41f..011c62fa563c 100644
--- a/arch/x86/kernel/signal_32.c
+++ b/arch/x86/kernel/signal_32.c
@@ -365,7 +365,7 @@ static int setup_frame(int sig, struct k_sigaction *ka,
365 goto give_sigsegv; 365 goto give_sigsegv;
366 } 366 }
367 367
368 if (current->binfmt->hasvdso) 368 if (current->mm->context.vdso)
369 restorer = VDSO32_SYMBOL(current->mm->context.vdso, sigreturn); 369 restorer = VDSO32_SYMBOL(current->mm->context.vdso, sigreturn);
370 else 370 else
371 restorer = &frame->retcode; 371 restorer = &frame->retcode;