]> granicus.if.org Git - strace/commitdiff
ptrace: decode data argument of PTRACE_PEEKSIGINFO request
authorDmitry V. Levin <ldv@altlinux.org>
Fri, 13 May 2016 02:33:33 +0000 (02:33 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Fri, 13 May 2016 02:36:14 +0000 (02:36 +0000)
The data argument of PTRACE_PEEKSIGINFO request is a pointer
to siginfo_t array.

* printsiginfo.c (print_siginfo_t): New function.
(print_siginfo_array): New mpers printer.
* process.c (SYS_FUNC(ptrace)): Print data argument of
PTRACE_PEEKSIGINFO request using print_siginfo_array.

printsiginfo.c
process.c

index 240fd65eb0b5cf8880827e3236d6cc1c76a82ff3..596d958a4a02eef7fe9fccb7ccdcf11bc826c96d 100644 (file)
@@ -242,3 +242,21 @@ MPERS_PRINTER_DECL(void, printsiginfo_at)(struct tcb *tcp, long addr)
        if (!umove_or_printaddr(tcp, addr, &si))
                printsiginfo(&si, verbose(tcp));
 }
+
+static bool
+print_siginfo_t(struct tcb *tcp, void *elem_buf, size_t elem_size, void *data)
+{
+       const siginfo_t *si = elem_buf;
+
+       printsiginfo(si, verbose(tcp));
+
+       return true;
+}
+
+MPERS_PRINTER_DECL(void, print_siginfo_array)(struct tcb *tcp, unsigned long addr, unsigned long len)
+{
+       siginfo_t si;
+
+       print_array(tcp, addr, len, &si, sizeof(si),
+                   umoven_or_printaddr, print_siginfo_t, 0);
+}
index 19b616d04dc52de258bd77916187109a10a7c1ab..3aecf088d36b1b9d89207601a02d8eea0f876070 100644 (file)
--- a/process.c
+++ b/process.c
@@ -212,6 +212,7 @@ SYS_FUNC(ptrace)
                case PTRACE_GETREGSET:
                case PTRACE_GETSIGINFO:
                case PTRACE_GETSIGMASK:
+               case PTRACE_PEEKSIGINFO:
                case PTRACE_SECCOMP_GET_FILTER:
                        if (verbose(tcp)) {
                                /* print data on exiting syscall */
@@ -245,6 +246,12 @@ SYS_FUNC(ptrace)
                case PTRACE_GETSIGMASK:
                        print_sigset_addr_len(tcp, data, addr);
                        break;
+               case PTRACE_PEEKSIGINFO:
+                       if (syserror(tcp))
+                               printaddr(data);
+                       else
+                               print_siginfo_array(tcp, data, tcp->u_rval);
+                       break;
                case PTRACE_SECCOMP_GET_FILTER:
                        if (syserror(tcp))
                                printaddr(data);