| From 5fe81fe98123ce41265c65e95d34418d30d005d1 Mon Sep 17 00:00:00 2001 |
| From: Dave Martin <Dave.Martin@arm.com> |
| Date: Mon, 27 Mar 2017 15:10:56 +0100 |
| Subject: [PATCH] metag/ptrace: Provide default TXSTATUS for short NT_PRSTATUS |
| |
| commit 5fe81fe98123ce41265c65e95d34418d30d005d1 upstream. |
| |
| Ensure that if userspace supplies insufficient data to PTRACE_SETREGSET |
| to fill TXSTATUS, a well-defined default value is used, based on the |
| task's current value. |
| |
| Suggested-by: James Hogan <james.hogan@imgtec.com> |
| Signed-off-by: Dave Martin <Dave.Martin@arm.com> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| |
| diff --git a/arch/metag/kernel/ptrace.c b/arch/metag/kernel/ptrace.c |
| index ae659ba61948..2e4dfc15abd3 100644 |
| --- a/arch/metag/kernel/ptrace.c |
| +++ b/arch/metag/kernel/ptrace.c |
| @@ -24,6 +24,16 @@ |
| * user_regset definitions. |
| */ |
| |
| +static unsigned long user_txstatus(const struct pt_regs *regs) |
| +{ |
| + unsigned long data = (unsigned long)regs->ctx.Flags; |
| + |
| + if (regs->ctx.SaveMask & TBICTX_CBUF_BIT) |
| + data |= USER_GP_REGS_STATUS_CATCH_BIT; |
| + |
| + return data; |
| +} |
| + |
| int metag_gp_regs_copyout(const struct pt_regs *regs, |
| unsigned int pos, unsigned int count, |
| void *kbuf, void __user *ubuf) |
| @@ -62,9 +72,7 @@ int metag_gp_regs_copyout(const struct pt_regs *regs, |
| if (ret) |
| goto out; |
| /* TXSTATUS */ |
| - data = (unsigned long)regs->ctx.Flags; |
| - if (regs->ctx.SaveMask & TBICTX_CBUF_BIT) |
| - data |= USER_GP_REGS_STATUS_CATCH_BIT; |
| + data = user_txstatus(regs); |
| ret = user_regset_copyout(&pos, &count, &kbuf, &ubuf, |
| &data, 4*25, 4*26); |
| if (ret) |
| @@ -119,6 +127,7 @@ int metag_gp_regs_copyin(struct pt_regs *regs, |
| if (ret) |
| goto out; |
| /* TXSTATUS */ |
| + data = user_txstatus(regs); |
| ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, |
| &data, 4*25, 4*26); |
| if (ret) |
| -- |
| 2.12.0 |
| |