2018-06-11 22:16:15

by Jim Wilson

[permalink] [raw]
Subject: [PATCH] RISC-V: Fix PTRACE_SETREGSET bug.

In riscv_gpr_set, pass regs instead of &regs to user_regset_copyin to fix
gdb segfault.

Signed-off-by: Jim Wilson <[email protected]>
---
arch/riscv/kernel/ptrace.c | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/arch/riscv/kernel/ptrace.c b/arch/riscv/kernel/ptrace.c
index ba3e80712797..9f82a7e34c64 100644
--- a/arch/riscv/kernel/ptrace.c
+++ b/arch/riscv/kernel/ptrace.c
@@ -50,7 +50,7 @@ static int riscv_gpr_set(struct task_struct *target,
struct pt_regs *regs;

regs = task_pt_regs(target);
- ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &regs, 0, -1);
+ ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, regs, 0, -1);
return ret;
}

--
2.17.1



2018-06-12 00:48:56

by Palmer Dabbelt

[permalink] [raw]
Subject: Re: [PATCH] RISC-V: Fix PTRACE_SETREGSET bug.

On Mon, 11 Jun 2018 14:48:22 PDT (-0700), Jim Wilson wrote:
> In riscv_gpr_set, pass regs instead of &regs to user_regset_copyin to fix
> gdb segfault.
>
> Signed-off-by: Jim Wilson <[email protected]>
> ---
> arch/riscv/kernel/ptrace.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/arch/riscv/kernel/ptrace.c b/arch/riscv/kernel/ptrace.c
> index ba3e80712797..9f82a7e34c64 100644
> --- a/arch/riscv/kernel/ptrace.c
> +++ b/arch/riscv/kernel/ptrace.c
> @@ -50,7 +50,7 @@ static int riscv_gpr_set(struct task_struct *target,
> struct pt_regs *regs;
>
> regs = task_pt_regs(target);
> - ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &regs, 0, -1);
> + ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, regs, 0, -1);
> return ret;
> }

Whoops, that's embarassing :). I poked around and didn't see this anywhere
else, so I'm not sure where we managed to obtain this particular pathology.

Thanks for the patch!

2018-06-12 03:28:43

by Jim Wilson

[permalink] [raw]
Subject: Re: [PATCH] RISC-V: Fix PTRACE_SETREGSET bug.

On Mon, Jun 11, 2018 at 5:46 PM, Palmer Dabbelt <[email protected]> wrote:
> Whoops, that's embarassing :). I poked around and didn't see this anywhere
> else, so I'm not sure where we managed to obtain this particular pathology.

Comment say it was copied from tile which I think was just recently
removed. But looking at older copy, tile has "struct pt_regs regs"
whereas riscv has "struct pt_regs *regs" and so tile needed the & and
riscv does not, but only one of the two ampersands was removed in the
riscv port. My patch removes the other one.

Jim