From: Steven Rostedt (VMware) <rost...@goodmis.org>

[ Upstream commit 74621d929d944529a5e2878a84f48bfa6fb69a66 ]

Commit c61f13eaa1ee1 ("gcc-plugins: Add structleak for more stack
initialization") added "__attribute__((user))" to the user when
stackleak detector is enabled. This now appears in the field format of
system call trace events for system calls that have user buffers. The
"__attribute__((user))" breaks the parsing in libtraceevent. That needs
to be handled.

Signed-off-by: Steven Rostedt (VMware) <rost...@goodmis.org>
Cc: Andrew Morton <a...@linux-foundation.org>
Cc: Jaewon Kim <jaewon31....@samsung.com>
Cc: Jiri Olsa <jo...@redhat.com>
Cc: Kees Kook <keesc...@chromium.org>
Cc: Namhyung Kim <namhy...@kernel.org>
Cc: Vlastimil Babka <vba...@suse.cz>
Cc: linux...@kvack.org
Cc: linux-trace-de...@vger.kernel.org
Link: http://lore.kernel.org/lkml/20200324200956.663647...@goodmis.org
Signed-off-by: Arnaldo Carvalho de Melo <a...@redhat.com>
Signed-off-by: Sasha Levin <sas...@kernel.org>
---
 tools/lib/traceevent/event-parse.c | 39 +++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

diff --git a/tools/lib/traceevent/event-parse.c 
b/tools/lib/traceevent/event-parse.c
index 4bc3e1b906652..798284f511f16 100644
--- a/tools/lib/traceevent/event-parse.c
+++ b/tools/lib/traceevent/event-parse.c
@@ -1444,6 +1444,7 @@ static int event_read_fields(struct tep_event *event, 
struct tep_format_field **
        enum tep_event_type type;
        char *token;
        char *last_token;
+       char *delim = " ";
        int count = 0;
        int ret;
 
@@ -1504,13 +1505,49 @@ static int event_read_fields(struct tep_event *event, 
struct tep_format_field **
                                        field->flags |= TEP_FIELD_IS_POINTER;
 
                                if (field->type) {
-                                       ret = append(&field->type, " ", 
last_token);
+                                       ret = append(&field->type, delim, 
last_token);
                                        free(last_token);
                                        if (ret < 0)
                                                goto fail;
                                } else
                                        field->type = last_token;
                                last_token = token;
+                               delim = " ";
+                               continue;
+                       }
+
+                       /* Handle __attribute__((user)) */
+                       if ((type == TEP_EVENT_DELIM) &&
+                           strcmp("__attribute__", last_token) == 0 &&
+                           token[0] == '(') {
+                               int depth = 1;
+                               int ret;
+
+                               ret = append(&field->type, " ", last_token);
+                               ret |= append(&field->type, "", "(");
+                               if (ret < 0)
+                                       goto fail;
+
+                               delim = " ";
+                               while ((type = read_token(&token)) != 
TEP_EVENT_NONE) {
+                                       if (type == TEP_EVENT_DELIM) {
+                                               if (token[0] == '(')
+                                                       depth++;
+                                               else if (token[0] == ')')
+                                                       depth--;
+                                               if (!depth)
+                                                       break;
+                                               ret = append(&field->type, "", 
token);
+                                               delim = "";
+                                       } else {
+                                               ret = append(&field->type, 
delim, token);
+                                               delim = " ";
+                                       }
+                                       if (ret < 0)
+                                               goto fail;
+                                       free(last_token);
+                                       last_token = token;
+                               }
                                continue;
                        }
                        break;
-- 
2.25.1



Reply via email to