Skip to content

Commit 82123a3

Browse files
rnavmpe
authored andcommitted
powerpc/kprobes: Fix validation of prefixed instructions across page boundary
When checking if the probed instruction is the suffix of a prefixed instruction, we access the instruction at the previous word. If the probed instruction is the very first word of a module, we can end up trying to access an invalid page. Fix this by skipping the check for all instructions at the beginning of a page. Prefixed instructions cannot cross a 64-byte boundary and as such, we don't expect to encounter a suffix as the very first word in a page for kernel text. Even if there are prefixed instructions crossing a page boundary (from a module, for instance), the instruction will be illegal, so preventing probing on the suffix of such prefix instructions isn't worthwhile. Fixes: b4657f7 ("powerpc/kprobes: Don't allow breakpoints on suffixes") Cc: stable@vger.kernel.org # v5.8+ Reported-by: Christophe Leroy <christophe.leroy@csgroup.eu> Signed-off-by: Naveen N. Rao <naveen.n.rao@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au> Link: https://lore.kernel.org/r/0df9a032a05576a2fa8e97d1b769af2ff0eafbd6.1621416666.git.naveen.n.rao@linux.vnet.ibm.com
1 parent d72500f commit 82123a3

File tree

1 file changed

+2
-2
lines changed

1 file changed

+2
-2
lines changed

arch/powerpc/kernel/kprobes.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -108,15 +108,15 @@ int arch_prepare_kprobe(struct kprobe *p)
108108
int ret = 0;
109109
struct kprobe *prev;
110110
struct ppc_inst insn = ppc_inst_read((struct ppc_inst *)p->addr);
111-
struct ppc_inst prefix = ppc_inst_read((struct ppc_inst *)(p->addr - 1));
112111

113112
if ((unsigned long)p->addr & 0x03) {
114113
printk("Attempt to register kprobe at an unaligned address\n");
115114
ret = -EINVAL;
116115
} else if (IS_MTMSRD(insn) || IS_RFID(insn) || IS_RFI(insn)) {
117116
printk("Cannot register a kprobe on rfi/rfid or mtmsr[d]\n");
118117
ret = -EINVAL;
119-
} else if (ppc_inst_prefixed(prefix)) {
118+
} else if ((unsigned long)p->addr & ~PAGE_MASK &&
119+
ppc_inst_prefixed(ppc_inst_read((struct ppc_inst *)(p->addr - 1)))) {
120120
printk("Cannot register a kprobe on the second word of prefixed instruction\n");
121121
ret = -EINVAL;
122122
}

0 commit comments

Comments
 (0)