]> granicus.if.org Git - strace/blobdiff - process.c
x32: fix decoding of 3rd argument of preadv* and pwritev* syscalls
[strace] / process.c
index b61d354676d750e2317c4e83162671f79d61441d..32dcfe253739cda3eed79391ad812f5dc799739b 100644 (file)
--- a/process.c
+++ b/process.c
@@ -141,31 +141,35 @@ SYS_FUNC(ptrace)
                        tprintf(", nr=%u}", psi.nr);
                        break;
                }
-#if defined SPARC || defined SPARC64
+               default:
+                       tprints(", ");
+                       printaddr(addr);
+               }
+
+# if defined IA64 || defined SPARC || defined SPARC64
+               switch (request) {
+#  ifdef IA64
+               case PTRACE_PEEKDATA:
+               case PTRACE_PEEKTEXT:
+               case PTRACE_PEEKUSER:
+                       /* data is ignored */
+                       return RVAL_DECODED | RVAL_HEX;
+#  endif /* IA64 */
+#  if defined SPARC || defined SPARC64
                case PTRACE_GETREGS:
                case PTRACE_SETREGS:
                case PTRACE_GETFPREGS:
                case PTRACE_SETFPREGS:
-                       tprints(", ");
-                       printaddr(addr);
                        /* data is ignored */
                        return RVAL_DECODED;
-#endif
-               default:
-                       tprints(", ");
-                       printaddr(addr);
+#  endif /* SPARC || SPARC64 */
                }
+# endif /* IA64 || SPARC || SPARC64 */
 
                tprints(", ");
 
                /* data */
                switch (request) {
-#ifndef IA64
-               case PTRACE_PEEKDATA:
-               case PTRACE_PEEKTEXT:
-               case PTRACE_PEEKUSER:
-                       break;
-#endif
                case PTRACE_CONT:
                case PTRACE_DETACH:
                case PTRACE_SYSCALL:
@@ -183,39 +187,76 @@ SYS_FUNC(ptrace)
 #endif
                        printsignal(data);
                        break;
+               case PTRACE_SEIZE:
                case PTRACE_SETOPTIONS:
-                       printflags(ptrace_setoptions_flags, data, "PTRACE_O_???");
+#ifdef PTRACE_OLDSETOPTIONS
+               case PTRACE_OLDSETOPTIONS:
+#endif
+                       printflags64(ptrace_setoptions_flags, data, "PTRACE_O_???");
                        break;
                case PTRACE_SETSIGINFO:
                        printsiginfo_at(tcp, data);
                        break;
+               case PTRACE_SETSIGMASK:
+                       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_GETSIGINFO:
+#ifndef IA64
+               case PTRACE_PEEKDATA:
+               case PTRACE_PEEKTEXT:
+               case PTRACE_PEEKUSER:
+#endif
+               case PTRACE_GETEVENTMSG:
                case PTRACE_GETREGSET:
-                       /* Don't print anything, do it at syscall return. */
-                       break;
+               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 */
                default:
                        printaddr(data);
                        break;
                }
+
+               return RVAL_DECODED;
        } else {
                switch (request) {
+#ifndef IA64
                case PTRACE_PEEKDATA:
                case PTRACE_PEEKTEXT:
                case PTRACE_PEEKUSER:
-#ifdef IA64
-                       return RVAL_HEX;
-#else
                        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_GETREGSET:
-                       tprint_iov(tcp, /*len:*/ 1, data, /*as string:*/ 0);
+               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);
+                       else
+                               print_seccomp_fprog(tcp, data, tcp->u_rval);
                        break;
                }
        }