[PATCH 00/10] tracing/filters: Fix event filter parsing and matching bugs

From: Masami Hiramatsu (Google)

Date: Sat Oct 24 2026 - 12:25:50 EST


Hi,

Here is a series of fixes for various bugs in the trace event filter
parser and predicate evaluation in kernel/trace/trace_events_filter.c,
along with a new ftracetest test case covering filter syntax checks.

Summary of the patches:

- [01/10] Compute the actual string length with strnlen()/strlen() in
regex_match_end() so suffix matching ("*pattern") works on fixed-size
string fields (such as comm) and dynamic strings.
- [02/10] Fix process_system_preds() so that "fail" is only cleared when
at least one event in the subsystem succeeds, and use
delay_free_filter() when freeing replaced filters on error paths.
- [03/10] Check "cpu >= nr_cpu_ids" before calling cpumask_test_cpu() in
do_filter_cpumask_scalar() to avoid out-of-bounds bit tests when
NR_CPUS > nr_cpu_ids.
- [04/10] Return "pred->op == OP_NE" when "cpu >= nr_cpu_ids" in
DEFINE_CPUMASK_COMPARISON_PRED so "!=" against a cpumask evaluates to
true for out-of-range CPU numbers.
- [05/10] Ensure parse_error() is called on all -EINVAL error paths in
parse_pred(), predicate_parse(), and process_preds() instead of
leaving lasterr as 0 ("Error: (0)").
- [06/10] Fix function event ("ip") operand parsing in parse_pred() to
avoid reading past the NUL terminator on empty operands, check for
missing closing quotes, advance past closing quotes, and reject empty
operands or stray quotes/'(' in unquoted operands.
- [07/10] Advance past the second character of "&&" and "||" in
calc_stack() so the second operator character is not miscounted as a
new predicate.
- [08/10] Reject unsupported field sizes in parse_pred() when
select_comparison_fn() or CPUS{} size matching leaves pred->fn_num as
FILTER_PRED_FN_NOP, avoiding a kernel warning in update_pred_fn().
- [09/10] Terminate the input filter string at the first newline ('\n')
in create_filter_start(), apply_event_filter(), and
apply_subsystem_event_filter() so multi-line input cannot desynchronize
cpulist_parse()/parse_pred() from calc_stack() or misalign error_log
caret placement.
- [10/10] Add filter-syntax-check.tc to ftrace selftests to test valid
filters, syntax error diagnostics and caret positions, multi-line
input truncation, and subsystem filter error returns.

Note: These bugs were identified and the fixes and cover letter were
prepared with the assistance of an LLM coding assistant.

Also, note that [09/10] may need more discussion because it can break
user space tool which attempts to use line-break characters as a filter
for reasons that are not entirely clear. But as far as I can see, the
error_log does not support such multi-line filter input. So I think
we still need it. (But not sure we should backport it, maybe as an
improvement.)

Thank you,

---
base-commit: 1fdc4164e488916402badddbb1f51e9380dabb91

Masami Hiramatsu (Google) (10):
tracing/filters: Fix MATCH_END_ONLY regex matching for fixed-size strings
tracing/filters: Fix false success return in process_system_preds()
tracing/filters: Check CPU bounds before cpumask_test_cpu() in do_filter_cpumask_scalar()
tracing/filters: Handle out-of-range CPU for OP_NE in cpumask comparison
tracing/filters: Report parse error on all -EINVAL paths in filter parsing
tracing/filters: Fix function event operand parsing in parse_pred()
tracing/filters: Skip second character of '&&' and '||' in calc_stack()
tracing/filters: Reject unsupported field sizes in parse_pred()
tracing/filters: Terminate filter string at first newline
selftests/ftrace: Add event filter syntax check test case


kernel/trace/trace_events_filter.c | 100 +++++++++++++++-----
.../ftrace/test.d/filter/filter-syntax-check.tc | 52 ++++++++++
2 files changed, 129 insertions(+), 23 deletions(-)
create mode 100644 tools/testing/selftests/ftrace/test.d/filter/filter-syntax-check.tc

--
Masami Hiramatsu (Google) <mhiramat@xxxxxxxxxx>