tracing: Fix checking event hash pointer logic when tp_printk is enabled

Pointers in events that are printed are unhashed if the flags allow it,
and the logic to do so is called before processing the event output from
the raw ring buffer. In most cases, this is done when a user reads one of
the trace files.

But if tp_printk is added on the kernel command line, this logic is done
for trace events when they are triggered, and their output goes out via
printk. The unhash logic (and even the validation of the output) did not
support the tp_printk output, and would crash.

Link: https://lore.kernel.org/linux-tegra/9835d9f1-8d3a-3440-c53f-516c2606ad07@nvidia.com/

Fixes: efbbdaa2 ("tracing: Show real address for trace event arguments")
Reported-by: default avatarJon Hunter <jonathanh@nvidia.com>
Tested-by: default avatarJon Hunter <jonathanh@nvidia.com>
Signed-off-by: default avatarSteven Rostedt (VMware) <rostedt@goodmis.org>
parent 8db403b9
...@@ -3545,7 +3545,11 @@ static char *trace_iter_expand_format(struct trace_iterator *iter) ...@@ -3545,7 +3545,11 @@ static char *trace_iter_expand_format(struct trace_iterator *iter)
{ {
char *tmp; char *tmp;
if (iter->fmt == static_fmt_buf) /*
* iter->tr is NULL when used with tp_printk, which makes
* this get called where it is not safe to call krealloc().
*/
if (!iter->tr || iter->fmt == static_fmt_buf)
return NULL; return NULL;
tmp = krealloc(iter->fmt, iter->fmt_size + STATIC_FMT_BUF_SIZE, tmp = krealloc(iter->fmt, iter->fmt_size + STATIC_FMT_BUF_SIZE,
...@@ -3566,7 +3570,7 @@ const char *trace_event_format(struct trace_iterator *iter, const char *fmt) ...@@ -3566,7 +3570,7 @@ const char *trace_event_format(struct trace_iterator *iter, const char *fmt)
if (WARN_ON_ONCE(!fmt)) if (WARN_ON_ONCE(!fmt))
return fmt; return fmt;
if (iter->tr->trace_flags & TRACE_ITER_HASH_PTR) if (!iter->tr || iter->tr->trace_flags & TRACE_ITER_HASH_PTR)
return fmt; return fmt;
p = fmt; p = fmt;
...@@ -9692,7 +9696,7 @@ void __init early_trace_init(void) ...@@ -9692,7 +9696,7 @@ void __init early_trace_init(void)
{ {
if (tracepoint_printk) { if (tracepoint_printk) {
tracepoint_print_iter = tracepoint_print_iter =
kmalloc(sizeof(*tracepoint_print_iter), GFP_KERNEL); kzalloc(sizeof(*tracepoint_print_iter), GFP_KERNEL);
if (MEM_FAIL(!tracepoint_print_iter, if (MEM_FAIL(!tracepoint_print_iter,
"Failed to allocate trace iterator\n")) "Failed to allocate trace iterator\n"))
tracepoint_printk = 0; tracepoint_printk = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment