From: Steven Rostedt <rostedt@goodmis.org>
To: Linux Trace Devel <linux-trace-devel@vger.kernel.org>
Cc: Julia Lawall <julia.lawall@inria.fr>
Subject: [PATCH v2] libtraceevent: Handle parsing of "(REC)->" case
Date: Tue, 8 Jun 2021 17:27:44 -0400 [thread overview]
Message-ID: <20210608172744.796e93b7@gandalf.local.home> (raw)
From: "Steven Rostedt (VMware)" <rostedt@goodmis.org>
If a trace event wraps the special __entry variable to dereference it with
parenthesis, it shows up in the trace event format file wrapping the
"(REC)" as well. For example, the "func_repeats" event passed the __entry
into a helper macro in the TP_printk() portion, and the macro correctly
wrapped its parameter in parenthesis. This caused the output to show:
"(((u64)(REC)->top_delta_ts << 32) | (REC)->bottom_delta_ts)"
The parser then failed to parse the "(REC)->" portion, as it expected the
"->" to appear directly after the "REC". This is not a requirement, and
the parser should be able to handle such cases.
When this occurred, trace-cmd would error with the following message:
trace-cmd: No such file or directory
Error: expected type 4 but read 5
Fixes: 6582b0a ("tools/events: Add files to create libtraceevent.a")
Reported-by: Julia Lawall <julia.lawall@inria.fr>
Signed-off-by: Steven Rostedt (VMware) <rostedt@goodmis.org>
---
Changes since v1:
Update the change log to show the error message, in case
it happens again, it can be something to reference.
src/event-parse.c | 27 ++++++++++++++++++++++++---
1 file changed, 24 insertions(+), 3 deletions(-)
diff --git a/src/event-parse.c b/src/event-parse.c
index 97c1a97..1217491 100644
--- a/src/event-parse.c
+++ b/src/event-parse.c
@@ -2311,8 +2311,19 @@ process_entry(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
char *field;
char *token;
- if (read_expected(TEP_EVENT_OP, "->") < 0)
- goto out_err;
+ type = read_token_item(&token);
+ /*
+ * Check if REC happens to be surrounded by parenthesis, and
+ * return if that's the case, as "(REC)->" is valid.
+ * but return TEP_EVENT_ITEM.
+ */
+ if (type == TEP_EVENT_DELIM && strcmp(token, ")") == 0) {
+ *tok = token;
+ return TEP_EVENT_ITEM;
+ }
+
+ if (test_type_token(type, token, TEP_EVENT_OP, "->"))
+ goto out_free;
if (read_expect_type(TEP_EVENT_ITEM, &token) < 0)
goto out_free;
@@ -2338,7 +2349,6 @@ process_entry(struct tep_event *event __maybe_unused, struct tep_print_arg *arg,
out_free:
free_token(token);
- out_err:
*tok = NULL;
return TEP_EVENT_ERROR;
}
@@ -3033,6 +3043,17 @@ process_paren(struct tep_event *event, struct tep_print_arg *arg, char **tok)
if (type == TEP_EVENT_ERROR)
goto out_free;
+ /*
+ * If REC is surrounded by parenthesis, the process_arg()
+ * will return TEP_EVENT_ITEM with token == ")". In
+ * this case, we need to continue processing the item
+ * and return.
+ */
+ if (type == TEP_EVENT_ITEM && strcmp(token, ")") == 0) {
+ free_token(token);
+ return process_entry(event, arg, tok);
+ }
+
if (test_type_token(type, token, TEP_EVENT_DELIM, ")"))
goto out_free;
--
2.29.2
next reply other threads:[~2021-06-08 21:29 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-06-08 21:27 Steven Rostedt [this message]
2021-06-09 5:43 ` [PATCH v2] libtraceevent: Handle parsing of "(REC)->" case Julia Lawall
2021-06-09 11:07 ` Steven Rostedt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20210608172744.796e93b7@gandalf.local.home \
--to=rostedt@goodmis.org \
--cc=julia.lawall@inria.fr \
--cc=linux-trace-devel@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).