On Mon, 26 Oct 2026 16:49:57 -0400, Steven Rostedt <[email protected]> wrote:
> On Sun, 25 Oct 2026 17:38:22 +0900
> "Masami Hiramatsu (Google)" <[email protected]> wrote:
> 
> > From: Masami Hiramatsu (Google) <[email protected]>
> > 
> > Each trace event or subsystem only holds a single filter, and
> > append_filter_err() / tracing_log_err() caret placement assumes a
> > single-line filter string. However, apply_event_filter() and
> > apply_subsystem_event_filter() only call strstrip(), which strips
> > trailing newlines but leaves embedded newlines intact.
> > 
> > An embedded newline in a filter string (for example inside 'CPUS{0\n"}')
> > causes cpulist_parse() / bitmap_parselist() to treat '\n' as the end of
> > the cpulist and ignore trailing characters before '}', desynchronizing
> > quote tracking between calc_stack() and parse_pred() and misaligning
> > error_log caret reporting.
> > 
> > Terminate filter_string at the first '\n' in apply_event_filter(),
> > apply_subsystem_event_filter(), and create_filter_start() so only the
> > first line is parsed.
> 
> How about also checking if there's any non white space after the newline,
> and if so, fail the filter outright with -EINVAL?

Hm, indeed. That sounds good to me, because user gave a wrong input.

Thanks!

> 
> -- Steve
> 
> 
> > 
> > Signed-off-by: Masami Hiramatsu (Google) <[email protected]>
> > ---
> >  kernel/trace/trace_events_filter.c |   15 +++++++++++++++
> >  1 file changed, 15 insertions(+)
> > 
> > diff --git a/kernel/trace/trace_events_filter.c 
> > b/kernel/trace/trace_events_filter.c
> > index 8d7fb6e9d7f8..14afcca7a444 100644
> > --- a/kernel/trace/trace_events_filter.c
> > +++ b/kernel/trace/trace_events_filter.c
> > @@ -2426,10 +2426,15 @@ static int create_filter_start(char *filter_string, 
> > bool set_str,
> >     struct event_filter *filter;
> >     struct filter_parse_error *pe = NULL;
> >     int err = 0;
> > +   char *p;
> >  
> >     if (WARN_ON_ONCE(*pse || *filterp))
> >             return -EINVAL;
> >  
> > +   p = strchr(filter_string, '\n');
> > +   if (p)
> > +           *p = '\0';
> > +
> >     filter = kzalloc_obj(*filter);
> >     if (filter && set_str) {
> >             filter->filter_string = kstrdup(filter_string, GFP_KERNEL);
> > @@ -2543,11 +2548,16 @@ int apply_event_filter(struct trace_event_file 
> > *file, char *filter_string)
> >  {
> >     struct trace_event_call *call = file->event_call;
> >     struct event_filter *filter = NULL;
> > +   char *p;
> >     int err;
> >  
> >     if (file->flags & EVENT_FILE_FL_FREED)
> >             return -ENODEV;
> >  
> > +   p = strchr(filter_string, '\n');
> > +   if (p)
> > +           *p = '\0';
> > +
> >     if (!strcmp(strstrip(filter_string), "0")) {
> >             filter_disable(file);
> >             filter = event_filter(file);
> > @@ -2595,6 +2605,7 @@ int apply_subsystem_event_filter(struct 
> > trace_subsystem_dir *dir,
> >     struct trace_array *tr = dir->tr;
> >     struct event_filter *filter = NULL;
> >     int err = 0;
> > +   char *p;
> >  
> >     guard(mutex)(&event_mutex);
> >  
> > @@ -2602,6 +2613,10 @@ int apply_subsystem_event_filter(struct 
> > trace_subsystem_dir *dir,
> >     if (!dir->nr_events)
> >             return -ENODEV;
> >  
> > +   p = strchr(filter_string, '\n');
> > +   if (p)
> > +           *p = '\0';
> > +
> >     if (!strcmp(strstrip(filter_string), "0")) {
> >             filter_free_subsystem_preds(dir, tr);
> >             remove_filter_string(system->filter);
> 
> 
>

-- 
Masami Hiramatsu (Google) <[email protected]>

Reply via email to