]> granicus.if.org Git - strace/blobdiff - process.c
nlattr: add UID/GID netlink attribute decoders
[strace] / process.c
index afac431a2c18e6d4773cc253e93de458a968ab40..4780311369b25e29359dbbf31cec3265ad795853 100644 (file)
--- a/process.c
+++ b/process.c
@@ -8,6 +8,7 @@
  *                    <barrow_dj@mail.yahoo.com,djbarrow@de.ibm.com>
  * Copyright (c) 2000 PocketPenguins Inc.  Linux for Hitachi SuperH
  *                    port by Greg Banks <gbanks@pocketpenguins.com>
+ * Copyright (c) 1999-2018 The strace developers.
  *
  * All rights reserved.
  *
 # include <elf.h>
 #endif
 
-#include "xlat/nt_descriptor_types.h"
-
-#include "regs.h"
 #include "ptrace.h"
+#include "regs.h"
+
+#include "xlat/nt_descriptor_types.h"
 #include "xlat/ptrace_cmds.h"
 #include "xlat/ptrace_setoptions_flags.h"
 #include "xlat/ptrace_peeksiginfo_flags.h"
@@ -57,7 +58,7 @@ static const struct xlat struct_user_offsets[] = {
 };
 
 static void
-print_user_offset_addr(const unsigned long addr)
+print_user_offset_addr(const kernel_ulong_t addr)
 {
        const struct xlat *x;
 
@@ -73,8 +74,8 @@ print_user_offset_addr(const unsigned long addr)
                        printaddr(addr);
                } else {
                        --x;
-                       tprintf("%s + %lu",
-                               x->str, addr - (unsigned long) x->val);
+                       tprintf("%s + %" PRI_klu,
+                               x->str, addr - (kernel_ulong_t) x->val);
                }
        } else {
                tprints(x->str);
@@ -83,10 +84,10 @@ print_user_offset_addr(const unsigned long addr)
 
 SYS_FUNC(ptrace)
 {
-       const unsigned long request = tcp->u_arg[0];
+       const kernel_ulong_t request = tcp->u_arg[0];
        const int pid = tcp->u_arg[1];
-       const unsigned long addr = tcp->u_arg[2];
-       const unsigned long data = tcp->u_arg[3];
+       const kernel_ulong_t addr = tcp->u_arg[2];
+       const kernel_ulong_t data = tcp->u_arg[3];
 
        if (entering(tcp)) {
                /* request */
@@ -121,7 +122,8 @@ SYS_FUNC(ptrace)
                case PTRACE_GETSIGMASK:
                case PTRACE_SETSIGMASK:
                case PTRACE_SECCOMP_GET_FILTER:
-                       tprintf(", %lu", addr);
+               case PTRACE_SECCOMP_GET_METADATA:
+                       tprintf(", %" PRI_klu, addr);
                        break;
                case PTRACE_PEEKSIGINFO: {
                        tprints(", ");
@@ -201,21 +203,39 @@ SYS_FUNC(ptrace)
                        print_sigset_addr_len(tcp, data, addr);
                        break;
                case PTRACE_SETREGSET:
-                       tprint_iov(tcp, /*len:*/ 1, data, /*as string:*/ 0);
+                       tprint_iov(tcp, /*len:*/ 1, data, IOV_DECODE_ADDR);
+                       break;
+               case PTRACE_SECCOMP_GET_METADATA:
+                       if (verbose(tcp)) {
+                               uint64_t filter_off;
+                               if (addr < sizeof(filter_off) ||
+                                   umove(tcp, data, &filter_off)) {
+                                       printaddr(data);
+                                       return RVAL_DECODED;
+                               }
+
+                               tprintf("{filter_off=%" PRIu64, filter_off);
+                               return 0;
+                       }
+
+                       printaddr(data);
                        break;
 #ifndef IA64
                case PTRACE_PEEKDATA:
                case PTRACE_PEEKTEXT:
                case PTRACE_PEEKUSER:
 #endif
+               case PTRACE_GETEVENTMSG:
                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 */
                                return 0;
                        }
-                       /* fall through */
+                       ATTRIBUTE_FALLTHROUGH;
                default:
                        printaddr(data);
                        break;
@@ -231,15 +251,50 @@ SYS_FUNC(ptrace)
                        printnum_ptr(tcp, data);
                        break;
 #endif
+               case PTRACE_GETEVENTMSG:
+                       printnum_ulong(tcp, data);
+                       break;
+               case PTRACE_GETREGSET:
+                       tprint_iov(tcp, /*len:*/ 1, data, IOV_DECODE_ADDR);
+                       break;
                case PTRACE_GETSIGINFO:
                        printsiginfo_at(tcp, data);
                        break;
                case PTRACE_GETSIGMASK:
                        print_sigset_addr_len(tcp, data, addr);
                        break;
-               case PTRACE_GETREGSET:
-                       tprint_iov(tcp, /*len:*/ 1, data, /*as string:*/ 0);
+               case PTRACE_PEEKSIGINFO:
+                       print_siginfo_array(tcp, data, tcp->u_rval);
+                       break;
+               case PTRACE_SECCOMP_GET_FILTER:
+                       print_seccomp_fprog(tcp, data, tcp->u_rval);
                        break;
+               case PTRACE_SECCOMP_GET_METADATA: {
+                       const size_t offset = sizeof(uint64_t);
+                       uint64_t flags = 0;
+                       size_t ret_size = MIN((kernel_ulong_t) tcp->u_rval,
+                                             offset + sizeof(flags));
+
+                       if (syserror(tcp) || ret_size <= offset) {
+                               tprints("}");
+                               return 0;
+                       }
+
+                       if (umoven(tcp, data + offset, ret_size - offset,
+                                  &flags)) {
+                               tprints(", ...}");
+                               return 0;
+                       }
+
+                       tprints(", flags=");
+                       printflags64(seccomp_filter_flags, flags,
+                                    "SECCOMP_FILTER_FLAG_???");
+
+                       if ((kernel_ulong_t) tcp->u_rval > ret_size)
+                               tprints(", ...");
+
+                       tprints("}");
+               }
                }
        }
        return 0;