diff options
Diffstat (limited to 'tools/lib/traceevent/event-parse.c')
-rw-r--r-- | tools/lib/traceevent/event-parse.c | 22 |
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 | |||
1434 | fail: | 1434 | fail: |
1435 | free_token(token); | 1435 | free_token(token); |
1436 | fail_expect: | 1436 | fail_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); |