diff options
-rw-r--r-- | tools/perf/util/parse-events.c | 24 | ||||
-rw-r--r-- | tools/perf/util/parse-events.l | 2 |
2 files changed, 25 insertions, 1 deletions
diff --git a/tools/perf/util/parse-events.c b/tools/perf/util/parse-events.c index c0b785b50849..020323af3364 100644 --- a/tools/perf/util/parse-events.c +++ b/tools/perf/util/parse-events.c | |||
@@ -722,6 +722,27 @@ static int get_event_modifier(struct event_modifier *mod, char *str, | |||
722 | return 0; | 722 | return 0; |
723 | } | 723 | } |
724 | 724 | ||
725 | /* | ||
726 | * Basic modifier sanity check to validate it contains only one | ||
727 | * instance of any modifier (apart from 'p') present. | ||
728 | */ | ||
729 | static int check_modifier(char *str) | ||
730 | { | ||
731 | char *p = str; | ||
732 | |||
733 | /* The sizeof includes 0 byte as well. */ | ||
734 | if (strlen(str) > (sizeof("ukhGHppp") - 1)) | ||
735 | return -1; | ||
736 | |||
737 | while (*p) { | ||
738 | if (*p != 'p' && strchr(p + 1, *p)) | ||
739 | return -1; | ||
740 | p++; | ||
741 | } | ||
742 | |||
743 | return 0; | ||
744 | } | ||
745 | |||
725 | int parse_events__modifier_event(struct list_head *list, char *str, bool add) | 746 | int parse_events__modifier_event(struct list_head *list, char *str, bool add) |
726 | { | 747 | { |
727 | struct perf_evsel *evsel; | 748 | struct perf_evsel *evsel; |
@@ -730,6 +751,9 @@ int parse_events__modifier_event(struct list_head *list, char *str, bool add) | |||
730 | if (str == NULL) | 751 | if (str == NULL) |
731 | return 0; | 752 | return 0; |
732 | 753 | ||
754 | if (check_modifier(str)) | ||
755 | return -EINVAL; | ||
756 | |||
733 | if (!add && get_event_modifier(&mod, str, NULL)) | 757 | if (!add && get_event_modifier(&mod, str, NULL)) |
734 | return -EINVAL; | 758 | return -EINVAL; |
735 | 759 | ||
diff --git a/tools/perf/util/parse-events.l b/tools/perf/util/parse-events.l index 66959fab6634..e9d1134c2c68 100644 --- a/tools/perf/util/parse-events.l +++ b/tools/perf/util/parse-events.l | |||
@@ -82,7 +82,7 @@ num_hex 0x[a-fA-F0-9]+ | |||
82 | num_raw_hex [a-fA-F0-9]+ | 82 | num_raw_hex [a-fA-F0-9]+ |
83 | name [a-zA-Z_*?][a-zA-Z0-9_*?]* | 83 | name [a-zA-Z_*?][a-zA-Z0-9_*?]* |
84 | name_minus [a-zA-Z_*?][a-zA-Z0-9\-_*?]* | 84 | name_minus [a-zA-Z_*?][a-zA-Z0-9\-_*?]* |
85 | modifier_event [ukhpGH]{1,8} | 85 | modifier_event [ukhpGH]+ |
86 | modifier_bp [rwx]{1,3} | 86 | modifier_bp [rwx]{1,3} |
87 | 87 | ||
88 | %% | 88 | %% |