]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
parisc: Wire up PTRACE_GETREGS/PTRACE_SETREGS for compat case
authorHelge Deller <deller@gmx.de>
Wed, 1 Feb 2023 15:41:54 +0000 (16:41 +0100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 15 Feb 2023 16:22:19 +0000 (17:22 +0100)
commit 316f1f42b5cc1d95124c1f0387c867c1ba7b6d0e upstream.

Wire up the missing ptrace requests PTRACE_GETREGS, PTRACE_SETREGS,
PTRACE_GETFPREGS and PTRACE_SETFPREGS when running 32-bit applications
on 64-bit kernels.

Signed-off-by: Helge Deller <deller@gmx.de>
Cc: stable@vger.kernel.org # 4.7+
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
arch/parisc/kernel/ptrace.c

index 2127974982df9a029b9c8819a257debb30bb5f0c..df9b9f0591bfbeb2c18a7a361174f437fdc041f1 100644 (file)
@@ -127,6 +127,12 @@ long arch_ptrace(struct task_struct *child, long request,
        unsigned long tmp;
        long ret = -EIO;
 
+       unsigned long user_regs_struct_size = sizeof(struct user_regs_struct);
+#ifdef CONFIG_64BIT
+       if (is_compat_task())
+               user_regs_struct_size /= 2;
+#endif
+
        switch (request) {
 
        /* Read the word at location addr in the USER area.  For ptraced
@@ -182,14 +188,14 @@ long arch_ptrace(struct task_struct *child, long request,
                return copy_regset_to_user(child,
                                           task_user_regset_view(current),
                                           REGSET_GENERAL,
-                                          0, sizeof(struct user_regs_struct),
+                                          0, user_regs_struct_size,
                                           datap);
 
        case PTRACE_SETREGS:    /* Set all gp regs in the child. */
                return copy_regset_from_user(child,
                                             task_user_regset_view(current),
                                             REGSET_GENERAL,
-                                            0, sizeof(struct user_regs_struct),
+                                            0, user_regs_struct_size,
                                             datap);
 
        case PTRACE_GETFPREGS:  /* Get the child FPU state. */
@@ -303,6 +309,11 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
                        }
                }
                break;
+       case PTRACE_GETREGS:
+       case PTRACE_SETREGS:
+       case PTRACE_GETFPREGS:
+       case PTRACE_SETFPREGS:
+               return arch_ptrace(child, request, addr, data);
 
        default:
                ret = compat_ptrace_request(child, request, addr, data);