From: Dmitry V. Levin Date: Fri, 27 Nov 2015 03:34:23 +0000 (+0000) Subject: x32: fix sigreturn decoding X-Git-Tag: v4.11~93 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=26207512e293eacb1e4cf292f8fda1b9fb8c0a48;p=strace 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". --- 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"