arm64: compat: Always use sigpage for sigreturn trampoline
authorWill Deacon <will@kernel.org>
Mon, 22 Jun 2020 12:09:49 +0000 (13:09 +0100)
committerWill Deacon <will@kernel.org>
Tue, 23 Jun 2020 13:56:24 +0000 (14:56 +0100)
The 32-bit sigreturn trampoline in the compat sigpage matches the binary
representation of the arch/arm/ sigpage exactly. This is important for
debuggers (e.g. GDB) and unwinders (e.g. libunwind) since they rely
on matching the instruction sequence in order to identify that they are
unwinding through a signal. The same cannot be said for the sigreturn
trampoline in the compat vDSO, which defeats the unwinder heuristics and
instead attempts to use unwind directives for the unwinding. This is in
contrast to arch/arm/, which never uses the vDSO for sigreturn.

Ensure compatibility with arch/arm/ and existing unwinders by always
using the sigpage for the sigreturn trampoline, regardless of the
presence of the compat vDSO.

Reviewed-by: Vincenzo Frascino <vincenzo.frascino@arm.com>
Reviewed-by: Ard Biesheuvel <ardb@kernel.org>
Reviewed-by: Mark Rutland <mark.rutland@arm.com>
Signed-off-by: Will Deacon <will@kernel.org>
arch/arm64/kernel/signal32.c

index 0aa0b33..2f507f5 100644 (file)
@@ -342,30 +342,6 @@ static void compat_setup_return(struct pt_regs *regs, struct k_sigaction *ka,
                retcode = ptr_to_compat(ka->sa.sa_restorer);
        } else {
                /* Set up sigreturn pointer */
-#ifdef CONFIG_COMPAT_VDSO
-               void *vdso_base = current->mm->context.vdso;
-               void *vdso_trampoline;
-
-               if (ka->sa.sa_flags & SA_SIGINFO) {
-                       if (thumb) {
-                               vdso_trampoline = VDSO_SYMBOL(vdso_base,
-                                                       compat_rt_sigreturn_thumb);
-                       } else {
-                               vdso_trampoline = VDSO_SYMBOL(vdso_base,
-                                                       compat_rt_sigreturn_arm);
-                       }
-               } else {
-                       if (thumb) {
-                               vdso_trampoline = VDSO_SYMBOL(vdso_base,
-                                                       compat_sigreturn_thumb);
-                       } else {
-                               vdso_trampoline = VDSO_SYMBOL(vdso_base,
-                                                       compat_sigreturn_arm);
-                       }
-               }
-
-               retcode = ptr_to_compat(vdso_trampoline) + thumb;
-#else
                unsigned int idx = thumb << 1;
 
                if (ka->sa.sa_flags & SA_SIGINFO)
@@ -373,7 +349,6 @@ static void compat_setup_return(struct pt_regs *regs, struct k_sigaction *ka,
 
                retcode = (unsigned long)current->mm->context.sigpage +
                          (idx << 2) + thumb;
-#endif
        }
 
        regs->regs[0]   = usig;