From 26207512e293eacb1e4cf292f8fda1b9fb8c0a48 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Fri, 27 Nov 2015 03:34:23 +0000 Subject: [PATCH] x32: fix sigreturn decoding * linux/x32/arch_sigreturn.c: Implement x32_rt_sigreturn decoding. * linux/x86_64/arch_sigreturn.c: Handle (current_personality == 0) case only. Include "x32/arch_sigreturn.c" instead of "i386/arch_sigreturn.c". --- linux/x32/arch_sigreturn.c | 16 +++++++++++++++- linux/x86_64/arch_sigreturn.c | 4 ++-- 2 files changed, 17 insertions(+), 3 deletions(-) diff --git a/linux/x32/arch_sigreturn.c b/linux/x32/arch_sigreturn.c index 9a778fc7..fd7359ff 100644 --- a/linux/x32/arch_sigreturn.c +++ b/linux/x32/arch_sigreturn.c @@ -1 +1,15 @@ -#include "x86_64/arch_sigreturn.c" +if (current_personality != 1) { + typedef struct { + uint32_t flags, link, stack[3], pad; + struct sigcontext mcontext; + } ucontext_x32_header; + + const unsigned long addr = + (unsigned long) *x86_64_rsp_ptr + + sizeof(ucontext_x32_header); + tprints("{mask="); + print_sigset_addr_len(tcp, addr, NSIG / 8); + tprints("}"); + return; +} +#include "i386/arch_sigreturn.c" diff --git a/linux/x86_64/arch_sigreturn.c b/linux/x86_64/arch_sigreturn.c index af49778b..4c1448b8 100644 --- a/linux/x86_64/arch_sigreturn.c +++ b/linux/x86_64/arch_sigreturn.c @@ -1,4 +1,4 @@ -if (current_personality != 1) { +if (current_personality == 0) { const unsigned long addr = (unsigned long) *x86_64_rsp_ptr + offsetof(struct ucontext, uc_sigmask); @@ -7,4 +7,4 @@ if (current_personality != 1) { tprints("}"); return; } -#include "i386/arch_sigreturn.c" +#include "x32/arch_sigreturn.c" -- 2.40.0