tracing: Check keys for variable references in expressions too [Linux 5.2]

tracing: Check keys for variable references in expressions too [Linux 5.2]

This Linux kernel change "tracing: Check keys for variable references in expressions too" is included in the Linux 5.2 release. This change is authored by Tom Zanussi <tom.zanussi [at] linux.intel.com> on Thu Apr 18 10:18:51 2019 -0500. The commit for this change in Linux stable tree is c8d94a1 (patch).

tracing: Check keys for variable references in expressions too

There's an existing check for variable references in keys, but it
doesn't go far enough.  It checks whether a key field is a variable
reference but doesn't check whether it's an expression containing
variable references, which can cause the same problems for callers.

Use the existing field_has_hist_vars() function rather than a direct
top-level flag check to catch all possible variable references.

Link: http://lkml.kernel.org/r/e8c3[email protected]linux.intel.com

Cc: [email protected]
Fixes: 067fe038e70f6 ("tracing: Add variable reference handling to hist triggers")
Reported-by: Vincent Bernat <[email protected]>
Signed-off-by: Tom Zanussi <[email protected]>
Signed-off-by: Steven Rostedt (VMware) <[email protected]>

There are 4 lines of Linux source code added/deleted in this change. Code changes to Linux kernel are as follows.

 kernel/trace/trace_events_hist.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/kernel/trace/trace_events_hist.c b/kernel/trace/trace_events_hist.c
index 06e7b9f..2b76f95 100644
--- a/kernel/trace/trace_events_hist.c
+++ b/kernel/trace/trace_events_hist.c
@@ -59,7 +59,7 @@
    C(NO_CLOSING_PAREN, "No closing paren found"),      \
    C(SUBSYS_NOT_FOUND, "Missing subsystem"),           \
    C(INVALID_SUBSYS_EVENT, "Invalid subsystem or event name"), \
-   C(INVALID_REF_KEY,  "Using variable references as keys not supported"), \
+   C(INVALID_REF_KEY,  "Using variable references in keys not supported"), \
    C(VAR_NOT_FOUND,    "Couldn't find variable"),      \
    C(FIELD_NOT_FOUND,  "Couldn't find field"),

@@ -4506,7 +4506,7 @@ static int create_key_field(struct hist_trigger_data *hist_data,
            goto out;
        }

-       if (hist_field->flags & HIST_FIELD_FL_VAR_REF) {
+       if (field_has_hist_vars(hist_field, 0)) {
            hist_err(tr, HIST_ERR_INVALID_REF_KEY, errpos(field_str));
            destroy_hist_field(hist_field, 0);
            ret = -EINVAL;

Leave a Reply

Your email address will not be published. Required fields are marked *