arm64/ptrace: Reject attempts to set incomplete hardware breakpoint fields
We cannot preserve partial fields for hardware breakpoints, because
the values written by userspace to the hardware breakpoint
registers can't subsequently be recovered intact from the hardware.
So, just reject attempts to write incomplete fields with -EINVAL.
Cc: <stable@vger.kernel.org> # 3.7.x-
Fixes: 478fcb2cdb
("arm64: Debugging support")
Signed-off-by: Dave Martin <Dave.Martin@arm.com>
Acked-by: Will Deacon <Will.Deacon@arm.com>
Signed-off-by: Catalin Marinas <catalin.marinas@arm.com>
This commit is contained in:
Родитель
aeb1f39d81
Коммит
ad9e202aa1
|
@ -551,6 +551,8 @@ static int hw_break_set(struct task_struct *target,
|
||||||
/* (address, ctrl) registers */
|
/* (address, ctrl) registers */
|
||||||
limit = regset->n * regset->size;
|
limit = regset->n * regset->size;
|
||||||
while (count && offset < limit) {
|
while (count && offset < limit) {
|
||||||
|
if (count < PTRACE_HBP_ADDR_SZ)
|
||||||
|
return -EINVAL;
|
||||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &addr,
|
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &addr,
|
||||||
offset, offset + PTRACE_HBP_ADDR_SZ);
|
offset, offset + PTRACE_HBP_ADDR_SZ);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
@ -560,6 +562,8 @@ static int hw_break_set(struct task_struct *target,
|
||||||
return ret;
|
return ret;
|
||||||
offset += PTRACE_HBP_ADDR_SZ;
|
offset += PTRACE_HBP_ADDR_SZ;
|
||||||
|
|
||||||
|
if (!count)
|
||||||
|
break;
|
||||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &ctrl,
|
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf, &ctrl,
|
||||||
offset, offset + PTRACE_HBP_CTRL_SZ);
|
offset, offset + PTRACE_HBP_CTRL_SZ);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
Загрузка…
Ссылка в новой задаче