lkml.org 
[lkml]   [2012]   [Oct]   [1]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Subject[PATCH v2] lib tools traceevent: Add back pevent assignment in __pevent_parse_format()
From
Date
Even though with the change of commit commit 2b29175 "tools lib traceevent:
Carve out events format parsing routine", allowed __pevent_parse_format() to
parse an event without the need of a pevent handler, the event still needs to
assign the pevent handed to it.

There's no problem with assigning it if the pevent is NULL, as the event->pevent
would be NULL without the assignment. But function parsing handlers may be
assigned to the pevent handler to help in parsing the event. If there's no
pevent then there would not be any function handlers, but if the pevent
isn't assigned first before parsing the event, it wont honor the function
handlers that were assigned.

Worse yet, the current code crashes if an event has a function that it tries
to parse. For example:

# perf record -e scsi:scsi_dispatch_cmd_timeout
Segmentation fault (core dumped)

This happens because the scsi_dispatch_cmd_timeout event format has the following:

scsi_trace_parse_cdb(p, __get_dynamic_array(cmnd), REC->cmd_len)

which hasn't been defined by the pevent code.

Reviewed-by: Namhyung Kim <namhyung@kernel.org>
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>


diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
index 47264b4..f2989c5 100644
--- a/tools/lib/traceevent/event-parse.c
+++ b/tools/lib/traceevent/event-parse.c
@@ -2602,6 +2602,9 @@ find_func_handler(struct pevent *pevent, char *func_name)
{
struct pevent_function_handler *func;

+ if (!pevent)
+ return NULL;
+
for (func = pevent->func_handlers; func; func = func->next) {
if (strcmp(func->name, func_name) == 0)
break;
@@ -4938,6 +4941,9 @@ enum pevent_errno __pevent_parse_format(struct event_format **eventp,
goto event_alloc_failed;
}

+ /* Add pevent to event so that it can be referenced */
+ event->pevent = pevent;
+
ret = event_read_format(event);
if (ret < 0) {
ret = PEVENT_ERRNO__READ_FORMAT_FAILED;
@@ -5041,9 +5047,6 @@ enum pevent_errno pevent_parse_event(struct pevent *pevent, const char *buf,
if (event == NULL)
return ret;

- /* Add pevent to event so that it can be referenced */
- event->pevent = pevent;
-
if (add_event(pevent, event)) {
ret = PEVENT_ERRNO__MEM_ALLOC_FAILED;
goto event_add_failed;





\
 
 \ /
  Last update: 2012-10-02 03:21    [W:0.055 / U:0.836 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site