]> granicus.if.org Git - strace/commitdiff
x32: fix sigreturn decoding
authorDmitry V. Levin <ldv@altlinux.org>
Fri, 27 Nov 2015 03:34:23 +0000 (03:34 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Fri, 27 Nov 2015 03:34:23 +0000 (03:34 +0000)
* 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
linux/x86_64/arch_sigreturn.c

index 9a778fc766838786153e45b1931402c18c98efec..fd7359ff0d793a359fb01268fe486e40867cecc8 100644 (file)
@@ -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"
index af49778b3cc45f1ec2b7c3255638c24c2a8dd8b4..4c1448b8ee27df3f87c5e9a7771e7e7e7712174f 100644 (file)
@@ -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"