Skip to content

Commit 6c14133

Browse files
committed
ftrace: Do not blindly read the ip address in ftrace_bug()
It was reported that a bug on arm64 caused a bad ip address to be used for updating into a nop in ftrace_init(), but the error path (rightfully) returned -EINVAL and not -EFAULT, as the bug caused more than one error to occur. But because -EINVAL was returned, the ftrace_bug() tried to report what was at the location of the ip address, and read it directly. This caused the machine to panic, as the ip was not pointing to a valid memory address. Instead, read the ip address with copy_from_kernel_nofault() to safely access the memory, and if it faults, report that the address faulted, otherwise report what was in that location. Link: https://lore.kernel.org/lkml/[email protected]/ Cc: [email protected] Fixes: 05736a4 ("ftrace: warn on failure to disable mcount callers") Reported-by: Mark-PK Tsai <[email protected]> Tested-by: Mark-PK Tsai <[email protected]> Signed-off-by: Steven Rostedt (VMware) <[email protected]>
1 parent 824afd5 commit 6c14133

File tree

1 file changed

+7
-1
lines changed

1 file changed

+7
-1
lines changed

kernel/trace/ftrace.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1967,12 +1967,18 @@ static int ftrace_hash_ipmodify_update(struct ftrace_ops *ops,
19671967

19681968
static void print_ip_ins(const char *fmt, const unsigned char *p)
19691969
{
1970+
char ins[MCOUNT_INSN_SIZE];
19701971
int i;
19711972

1973+
if (copy_from_kernel_nofault(ins, p, MCOUNT_INSN_SIZE)) {
1974+
printk(KERN_CONT "%s[FAULT] %px\n", fmt, p);
1975+
return;
1976+
}
1977+
19721978
printk(KERN_CONT "%s", fmt);
19731979

19741980
for (i = 0; i < MCOUNT_INSN_SIZE; i++)
1975-
printk(KERN_CONT "%s%02x", i ? ":" : "", p[i]);
1981+
printk(KERN_CONT "%s%02x", i ? ":" : "", ins[i]);
19761982
}
19771983

19781984
enum ftrace_bug_type ftrace_bug_type;

0 commit comments

Comments
 (0)