perf tools: Fix hybrid config terms list corruption
[linux-2.6-microblaze.git] / tools / perf / util / parse-events.c
index ded5808..51a2219 100644 (file)
@@ -387,7 +387,7 @@ __add_event(struct list_head *list, int *idx,
                evsel->name = strdup(name);
 
        if (config_terms)
-               list_splice(config_terms, &evsel->config_terms);
+               list_splice_init(config_terms, &evsel->config_terms);
 
        if (list)
                list_add_tail(&evsel->core.node, list);
@@ -535,9 +535,12 @@ int parse_events_add_cache(struct list_head *list, int *idx,
                                             config_name ? : name, &config_terms,
                                             &hybrid, parse_state);
        if (hybrid)
-               return ret;
+               goto out_free_terms;
 
-       return add_event(list, idx, &attr, config_name ? : name, &config_terms);
+       ret = add_event(list, idx, &attr, config_name ? : name, &config_terms);
+out_free_terms:
+       free_config_terms(&config_terms);
+       return ret;
 }
 
 static void tracepoint_error(struct parse_events_error *e, int err,
@@ -1457,10 +1460,13 @@ int parse_events_add_numeric(struct parse_events_state *parse_state,
                                               get_config_name(head_config),
                                               &config_terms, &hybrid);
        if (hybrid)
-               return ret;
+               goto out_free_terms;
 
-       return add_event(list, &parse_state->idx, &attr,
-                        get_config_name(head_config), &config_terms);
+       ret = add_event(list, &parse_state->idx, &attr,
+                       get_config_name(head_config), &config_terms);
+out_free_terms:
+       free_config_terms(&config_terms);
+       return ret;
 }
 
 int parse_events_add_tool(struct parse_events_state *parse_state,