aboutsummaryrefslogtreecommitdiffstats
path: root/tools/lib/traceevent/event-parse.c
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2012-05-30 14:12:00 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2012-05-30 14:12:00 -0400
commit65a50c951a38e9827dd9655b6e686bde912e799b (patch)
treecce85e74511741d52069977fee6984ce66c9277c /tools/lib/traceevent/event-parse.c
parent42fe55ce905212542426fa6407a76534a5fb696a (diff)
parent59cd358a7a5b2f6b61faa01dae6cfda3830ac62a (diff)
Merge branch 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
Pull perf updates from Ingo Molnar. * 'perf-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (21 commits) perf ui browser: Stop using 'self' perf annotate browser: Read perf config file for settings perf config: Allow '_' in config file variable names perf annotate browser: Make feature toggles global perf annotate browser: The idx_asm field should be used in asm only view perf tools: Convert critical messages to ui__error() perf ui: Make --stdio default when TUI is not supported tools lib traceevent: Silence compiler warning on 32bit build perf record: Fix branch_stack type in perf_record_opts perf tools: Reconstruct event with modifiers from perf_event_attr perf top: Fix counter name fixup when fallbacking to cpu-clock perf tools: fix thread_map__new_by_pid_str() memory leak in error path perf tools: Do not use _FORTIFY_SOURCE when DEBUG=1 is specified tools lib traceevent: Fix signature of create_arg_item() tools lib traceevent: Use proper function parameter type tools lib traceevent: Fix freeing arg on process_dynamic_array() tools lib traceevent: Fix a possibly wrong memory dereference tools lib traceevent: Fix a possible memory leak tools lib traceevent: Allow expressions in __print_symbolic() fields perf evlist: Explicititely initialize input_name ...
Diffstat (limited to 'tools/lib/traceevent/event-parse.c')
-rw-r--r--tools/lib/traceevent/event-parse.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c
index 998534992197..554828219c33 100644
--- a/tools/lib/traceevent/event-parse.c
+++ b/tools/lib/traceevent/event-parse.c
@@ -1434,8 +1434,11 @@ static int event_read_fields(struct event_format *event, struct format_field **f
1434fail: 1434fail:
1435 free_token(token); 1435 free_token(token);
1436fail_expect: 1436fail_expect:
1437 if (field) 1437 if (field) {
1438 free(field->type);
1439 free(field->name);
1438 free(field); 1440 free(field);
1441 }
1439 return -1; 1442 return -1;
1440} 1443}
1441 1444
@@ -1712,6 +1715,8 @@ process_op(struct event_format *event, struct print_arg *arg, char **tok)
1712 1715
1713 if (set_op_prio(arg) == -1) { 1716 if (set_op_prio(arg) == -1) {
1714 event->flags |= EVENT_FL_FAILED; 1717 event->flags |= EVENT_FL_FAILED;
1718 /* arg->op.op (= token) will be freed at out_free */
1719 arg->op.op = NULL;
1715 goto out_free; 1720 goto out_free;
1716 } 1721 }
1717 1722
@@ -2124,6 +2129,13 @@ process_fields(struct event_format *event, struct print_flag_sym **list, char **
2124 2129
2125 free_token(token); 2130 free_token(token);
2126 type = process_arg(event, arg, &token); 2131 type = process_arg(event, arg, &token);
2132
2133 if (type == EVENT_OP)
2134 type = process_op(event, arg, &token);
2135
2136 if (type == EVENT_ERROR)
2137 goto out_free;
2138
2127 if (test_type_token(type, token, EVENT_DELIM, ",")) 2139 if (test_type_token(type, token, EVENT_DELIM, ","))
2128 goto out_free; 2140 goto out_free;
2129 2141
@@ -2288,17 +2300,18 @@ process_dynamic_array(struct event_format *event, struct print_arg *arg, char **
2288 arg = alloc_arg(); 2300 arg = alloc_arg();
2289 type = process_arg(event, arg, &token); 2301 type = process_arg(event, arg, &token);
2290 if (type == EVENT_ERROR) 2302 if (type == EVENT_ERROR)
2291 goto out_free; 2303 goto out_free_arg;
2292 2304
2293 if (!test_type_token(type, token, EVENT_OP, "]")) 2305 if (!test_type_token(type, token, EVENT_OP, "]"))
2294 goto out_free; 2306 goto out_free_arg;
2295 2307
2296 free_token(token); 2308 free_token(token);
2297 type = read_token_item(tok); 2309 type = read_token_item(tok);
2298 return type; 2310 return type;
2299 2311
2312 out_free_arg:
2313 free_arg(arg);
2300 out_free: 2314 out_free:
2301 free(arg);
2302 free_token(token); 2315 free_token(token);
2303 *tok = NULL; 2316 *tok = NULL;
2304 return EVENT_ERROR; 2317 return EVENT_ERROR;
@@ -3362,6 +3375,7 @@ process_defined_func(struct trace_seq *s, void *data, int size,
3362 break; 3375 break;
3363 } 3376 }
3364 farg = farg->next; 3377 farg = farg->next;
3378 param = param->next;
3365 } 3379 }
3366 3380
3367 ret = (*func_handle->func)(s, args); 3381 ret = (*func_handle->func)(s, args);