Commit b87a95ad609619482df0690320d5ace33ace8e7a
Committed by
Linus Torvalds
1 parent
9afe33ada2
Exists in
smarc-imx_3.14.28_1.0.0_ga
and in
1 other branch
ptrace/x86: ptrace_write_dr7() should create bp if !disabled
Commit 24f1e32c60c4 ("hw-breakpoints: Rewrite the hw-breakpoints layer on top of perf events") introduced the minor regression. Before this commit PTRACE_POKEUSER DR7, enableDR0 PTRACE_POKEUSER DR0, address was perfectly valid, now PTRACE_POKEUSER(DR7) fails if DR0 was not previously initialized by PTRACE_POKEUSER(DR0). Change ptrace_write_dr7() to do ptrace_register_breakpoint(addr => 0) if !bp && !disabled. This fixes watchpoint-zeroaddr from ptrace-tests, see https://bugzilla.redhat.com/show_bug.cgi?id=660204. Signed-off-by: Oleg Nesterov <oleg@redhat.com> Reported-by: Jan Kratochvil <jan.kratochvil@redhat.com> Acked-by: Frederic Weisbecker <fweisbec@gmail.com> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Cc: Ingo Molnar <mingo@kernel.org> Cc: Michael Neuling <mikey@neuling.org> Cc: Paul Mackerras <paulus@samba.org> Cc: Paul Mundt <lethal@linux-sh.org> Cc: Will Deacon <will.deacon@arm.com> Cc: Prasad <prasad@linux.vnet.ibm.com> Cc: Russell King <linux@arm.linux.org.uk> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Showing 1 changed file with 10 additions and 7 deletions Side-by-side Diff
arch/x86/kernel/ptrace.c
... | ... | @@ -670,13 +670,16 @@ |
670 | 670 | if (!bp) { |
671 | 671 | if (disabled) |
672 | 672 | continue; |
673 | - /* | |
674 | - * We should have at least an inactive breakpoint at | |
675 | - * this slot. It means the user is writing dr7 without | |
676 | - * having written the address register first. | |
677 | - */ | |
678 | - rc = -EINVAL; | |
679 | - break; | |
673 | + | |
674 | + bp = ptrace_register_breakpoint(tsk, | |
675 | + len, type, 0, disabled); | |
676 | + if (IS_ERR(bp)) { | |
677 | + rc = PTR_ERR(bp); | |
678 | + break; | |
679 | + } | |
680 | + | |
681 | + thread->ptrace_bps[i] = bp; | |
682 | + continue; | |
680 | 683 | } |
681 | 684 | |
682 | 685 | rc = ptrace_modify_breakpoint(bp, len, type, disabled); |