sparc64: do not bail out in get_scno if PTRACE_PEEKTEXT fails
authorDmitry V. Levin <ldv@altlinux.org>
Fri, 4 Aug 2017 18:47:59 +0000 (18:47 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Fri, 4 Aug 2017 18:47:59 +0000 (18:47 +0000)
If the kernel contains commit 84d77d3f06e7e8dea057d10e8ec77ad71f721be3,
PTRACE_PEEKTEXT becames unavailable when the process dumpable flag is
cleared.  As this is not a fatal condition for get_scno, do not bail out
if PTRACE_PEEKTEXT fails.

This condition is triggered and therefore tested by prctl-dumpable test.

* linux/sparc64/get_scno.c (arch_get_scno): Do not bail out
if PTRACE_PEEKTEXT fails.

linux/sparc64/get_scno.c

index 4abe2a1f47faf1af36b173357c801b6a86f7834e..81a3aa93c82ffddf9dbb6599d4be760846e61e0a 100644 (file)
@@ -6,18 +6,18 @@ arch_get_scno(struct tcb *tcp)
        unsigned long trap;
        errno = 0;
        trap = ptrace(PTRACE_PEEKTEXT, tcp->pid, (void *) sparc_regs.tpc, 0);
-       if (errno)
-               return -1;
-       trap >>= 32;
-       switch (trap) {
-       case 0x91d02010:
-               /* Linux/SPARC syscall trap. */
-               update_personality(tcp, 1);
-               break;
-       case 0x91d0206d:
-               /* Linux/SPARC64 syscall trap. */
-               update_personality(tcp, 0);
-               break;
+       if (errno == 0) {
+               trap >>= 32;
+               switch (trap) {
+               case 0x91d02010:
+                       /* Linux/SPARC syscall trap. */
+                       update_personality(tcp, 1);
+                       break;
+               case 0x91d0206d:
+                       /* Linux/SPARC64 syscall trap. */
+                       update_personality(tcp, 0);
+                       break;
+               }
        }
 
        tcp->scno = sparc_regs.u_regs[U_REG_G1];