hc
2023-11-06 15ade055295d13f95d49e3d99b09f3bbfb4a43e7
kernel/tools/perf/util/parse-events.c
....@@ -223,21 +223,15 @@
223223 path = zalloc(sizeof(*path));
224224 if (!path)
225225 return NULL;
226
- path->system = malloc(MAX_EVENT_LENGTH);
227
- if (!path->system) {
226
+ if (asprintf(&path->system, "%.*s", MAX_EVENT_LENGTH, sys_dirent->d_name) < 0) {
228227 free(path);
229228 return NULL;
230229 }
231
- path->name = malloc(MAX_EVENT_LENGTH);
232
- if (!path->name) {
230
+ if (asprintf(&path->name, "%.*s", MAX_EVENT_LENGTH, evt_dirent->d_name) < 0) {
233231 zfree(&path->system);
234232 free(path);
235233 return NULL;
236234 }
237
- strncpy(path->system, sys_dirent->d_name,
238
- MAX_EVENT_LENGTH);
239
- strncpy(path->name, evt_dirent->d_name,
240
- MAX_EVENT_LENGTH);
241235 return path;
242236 }
243237 }
....@@ -1312,7 +1306,6 @@
13121306 int parse_events_multi_pmu_add(struct parse_events_state *parse_state,
13131307 char *str, struct list_head **listp)
13141308 {
1315
- struct list_head *head;
13161309 struct parse_events_term *term;
13171310 struct list_head *list;
13181311 struct perf_pmu *pmu = NULL;
....@@ -1329,19 +1322,30 @@
13291322
13301323 list_for_each_entry(alias, &pmu->aliases, list) {
13311324 if (!strcasecmp(alias->name, str)) {
1325
+ struct list_head *head;
1326
+ char *config;
1327
+
13321328 head = malloc(sizeof(struct list_head));
13331329 if (!head)
13341330 return -1;
13351331 INIT_LIST_HEAD(head);
1336
- if (parse_events_term__num(&term, PARSE_EVENTS__TERM_TYPE_USER,
1337
- str, 1, false, &str, NULL) < 0)
1332
+ config = strdup(str);
1333
+ if (!config)
13381334 return -1;
1335
+ if (parse_events_term__num(&term,
1336
+ PARSE_EVENTS__TERM_TYPE_USER,
1337
+ config, 1, false, &config,
1338
+ NULL) < 0) {
1339
+ free(list);
1340
+ free(config);
1341
+ return -1;
1342
+ }
13391343 list_add_tail(&term->list, head);
13401344
13411345 if (!parse_events_add_pmu(parse_state, list,
13421346 pmu->name, head,
13431347 true, true)) {
1344
- pr_debug("%s -> %s/%s/\n", str,
1348
+ pr_debug("%s -> %s/%s/\n", config,
13451349 pmu->name, alias->str);
13461350 ok++;
13471351 }
....@@ -1350,8 +1354,10 @@
13501354 }
13511355 }
13521356 }
1353
- if (!ok)
1357
+ if (!ok) {
1358
+ free(list);
13541359 return -1;
1360
+ }
13551361 *listp = list;
13561362 return 0;
13571363 }
....@@ -2625,30 +2631,51 @@
26252631 char *config, unsigned idx)
26262632 {
26272633 struct event_symbol *sym;
2634
+ char *str;
26282635 struct parse_events_term temp = {
26292636 .type_val = PARSE_EVENTS__TERM_TYPE_STR,
26302637 .type_term = PARSE_EVENTS__TERM_TYPE_USER,
2631
- .config = config ?: (char *) "event",
2638
+ .config = config,
26322639 };
26332640
2641
+ if (!temp.config) {
2642
+ temp.config = strdup("event");
2643
+ if (!temp.config)
2644
+ return -ENOMEM;
2645
+ }
26342646 BUG_ON(idx >= PERF_COUNT_HW_MAX);
26352647 sym = &event_symbols_hw[idx];
26362648
2637
- return new_term(term, &temp, (char *) sym->symbol, 0);
2649
+ str = strdup(sym->symbol);
2650
+ if (!str)
2651
+ return -ENOMEM;
2652
+ return new_term(term, &temp, str, 0);
26382653 }
26392654
26402655 int parse_events_term__clone(struct parse_events_term **new,
26412656 struct parse_events_term *term)
26422657 {
2658
+ char *str;
26432659 struct parse_events_term temp = {
26442660 .type_val = term->type_val,
26452661 .type_term = term->type_term,
2646
- .config = term->config,
2662
+ .config = NULL,
26472663 .err_term = term->err_term,
26482664 .err_val = term->err_val,
26492665 };
26502666
2651
- return new_term(new, &temp, term->val.str, term->val.num);
2667
+ if (term->config) {
2668
+ temp.config = strdup(term->config);
2669
+ if (!temp.config)
2670
+ return -ENOMEM;
2671
+ }
2672
+ if (term->type_val == PARSE_EVENTS__TERM_TYPE_NUM)
2673
+ return new_term(new, &temp, NULL, term->val.num);
2674
+
2675
+ str = strdup(term->val.str);
2676
+ if (!str)
2677
+ return -ENOMEM;
2678
+ return new_term(new, &temp, str, 0);
26522679 }
26532680
26542681 int parse_events_copy_term_list(struct list_head *old,