Skip to content

Commit ba16293

Browse files
Ravi Bangoriarostedt
authored andcommitted
tracing: Fix kernel crash while using empty filter with perf
Kernel is crashing when user tries to record 'ftrace:function' event with empty filter: # perf record -e ftrace:function --filter="" ls # dmesg BUG: unable to handle kernel NULL pointer dereference at 0000000000000008 Oops: 0000 [#1] SMP PTI ... RIP: 0010:ftrace_profile_set_filter+0x14b/0x2d0 RSP: 0018:ffffa4a7c0da7d20 EFLAGS: 00010246 RAX: ffffa4a7c0da7d64 RBX: 0000000000000000 RCX: 0000000000000006 RDX: 0000000000000000 RSI: 0000000000000092 RDI: ffff8c48ffc968f0 ... Call Trace: _perf_ioctl+0x54a/0x6b0 ? rcu_all_qs+0x5/0x30 ... After patch: # perf record -e ftrace:function --filter="" ls failed to set filter "" on event ftrace:function with 22 (Invalid argument) Also, if user tries to echo "" > filter, it used to throw an error. This behavior got changed by commit 8076559 ("tracing: Rewrite filter logic to be simpler and faster"). This patch restores the behavior as a side effect: Before patch: # echo "" > filter # After patch: # echo "" > filter bash: echo: write error: Invalid argument # Link: http://lkml.kernel.org/r/[email protected] Fixes: 8076559 ("tracing: Rewrite filter logic to be simpler and faster") Signed-off-by: Ravi Bangoria <[email protected]> Signed-off-by: Steven Rostedt (VMware) <[email protected]>
1 parent 1c758a2 commit ba16293

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

kernel/trace/trace_events_filter.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1499,14 +1499,14 @@ static int process_preds(struct trace_event_call *call,
14991499
return ret;
15001500
}
15011501

1502-
if (!nr_preds) {
1503-
prog = NULL;
1504-
} else {
1505-
prog = predicate_parse(filter_string, nr_parens, nr_preds,
1502+
if (!nr_preds)
1503+
return -EINVAL;
1504+
1505+
prog = predicate_parse(filter_string, nr_parens, nr_preds,
15061506
parse_pred, call, pe);
1507-
if (IS_ERR(prog))
1508-
return PTR_ERR(prog);
1509-
}
1507+
if (IS_ERR(prog))
1508+
return PTR_ERR(prog);
1509+
15101510
rcu_assign_pointer(filter->prog, prog);
15111511
return 0;
15121512
}

0 commit comments

Comments
 (0)