predicate_parse() uses the first operator stack entry before processing
any opening parentheses. A push then increments top before writing.
The existing check still permits that write when top already points to
the last allocated entry, which can access beyond the operator stack.

Reject the push when top reaches the last allocated entry.

Fixes: 39f7c41c908b ("tracing/filters: Enable filtering a cpumask field by 
another cpumask")
Cc: [email protected]
Signed-off-by: Taeyang Lee <[email protected]>
---
 kernel/trace/trace_events_filter.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/kernel/trace/trace_events_filter.c 
b/kernel/trace/trace_events_filter.c
index 781416ba6..127880ebe 100644
--- a/kernel/trace/trace_events_filter.c
+++ b/kernel/trace/trace_events_filter.c
@@ -511,7 +511,7 @@ predicate_parse(const char *str, int nr_parens, int 
nr_preds,
 
                switch (*next) {
                case '(':                                       /* #2 */
-                       if (top - op_stack > nr_parens) {
+                       if (top - op_stack >= nr_parens - 1) {
                                ret = -EINVAL;
                                goto out_free;
                        }
-- 
2.51.0


Reply via email to