@@ -2117,7 +2117,7 @@ static char *format_alias(char *buf, int len, const struct perf_pmu *pmu,
21172117 skip_duplicate_pmus );
21182118
21192119 /* Paramemterized events have the parameters shown. */
2120- if (strstr (alias -> terms , "=?" )) {
2120+ if (! strstr (alias -> terms , "=?" )) {
21212121 /* No parameters. */
21222122 snprintf (buf , len , "%.*s/%s/" , (int )pmu_name_len , pmu -> name , alias -> name );
21232123 return buf ;
@@ -2129,15 +2129,19 @@ static char *format_alias(char *buf, int len, const struct perf_pmu *pmu,
21292129 pr_err ("Failure to parse '%s' terms '%s': %d\n" ,
21302130 alias -> name , alias -> terms , ret );
21312131 parse_events_terms__exit (& terms );
2132- snprintf (buf , len , "%.*s/%s/" , (int )pmu_name_len , pmu -> name , alias -> name );
2132+ scnprintf (buf , len , "%.*s/%s/" , (int )pmu_name_len , pmu -> name , alias -> name );
21332133 return buf ;
21342134 }
2135- used = snprintf (buf , len , "%.*s/%s" , (int )pmu_name_len , pmu -> name , alias -> name );
2135+ used = scnprintf (buf , len , "%.*s/%s" , (int )pmu_name_len , pmu -> name , alias -> name );
21362136
21372137 list_for_each_entry (term , & terms .terms , list ) {
2138+ const char * name = term -> config ;
2139+
2140+ if (!name )
2141+ name = parse_events__term_type_str (term -> type_term );
21382142 if (term -> type_val == PARSE_EVENTS__TERM_TYPE_STR )
2139- used += snprintf (buf + used , sub_non_neg (len , used ),
2140- ",%s=%s" , term -> config ,
2143+ used += scnprintf (buf + used , sub_non_neg (len , used ),
2144+ ",%s=%s" , name ,
21412145 term -> val .str );
21422146 }
21432147 parse_events_terms__exit (& terms );
@@ -2201,6 +2205,7 @@ int perf_pmu__for_each_event(struct perf_pmu *pmu, bool skip_duplicate_pmus,
22012205 int ret = 0 ;
22022206 struct hashmap_entry * entry ;
22032207 size_t bkt ;
2208+ size_t size_rem , len ;
22042209
22052210 if (perf_pmu__is_tracepoint (pmu ))
22062211 return tp_pmu__for_each_event (pmu , state , cb );
@@ -2234,17 +2239,36 @@ int perf_pmu__for_each_event(struct perf_pmu *pmu, bool skip_duplicate_pmus,
22342239 }
22352240 buf_used = strlen (buf ) + 1 ;
22362241 }
2242+
22372243 info .scale_unit = NULL ;
22382244 if (strlen (event -> unit ) || event -> scale != 1.0 ) {
2239- info .scale_unit = buf + buf_used ;
2240- buf_used += snprintf (buf + buf_used , sizeof (buf ) - buf_used ,
2241- "%G%s" , event -> scale , event -> unit ) + 1 ;
2245+ /* Check the remaining space */
2246+ size_rem = sub_non_neg (sizeof (buf ), buf_used );
2247+
2248+ if (size_rem > 0 ) {
2249+ info .scale_unit = buf + buf_used ;
2250+ len = scnprintf (buf + buf_used , size_rem , "%G%s" ,
2251+ event -> scale , event -> unit );
2252+ /*
2253+ * Increment buf_used by 1 only if
2254+ * it fits remaining space
2255+ */
2256+ buf_used += min (len + 1 , size_rem );
2257+ }
22422258 }
22432259 info .desc = event -> desc ;
22442260 info .long_desc = event -> long_desc ;
2245- info .encoding_desc = buf + buf_used ;
2246- buf_used += snprintf (buf + buf_used , sizeof (buf ) - buf_used ,
2247- "%.*s/%s/" , (int )pmu_name_len , info .pmu_name , event -> terms ) + 1 ;
2261+ info .encoding_desc = NULL ;
2262+
2263+ /* Check the remaining space */
2264+ size_rem = sub_non_neg (sizeof (buf ), buf_used );
2265+ if (size_rem > 0 ) {
2266+ info .encoding_desc = buf + buf_used ;
2267+ len = scnprintf (buf + buf_used , size_rem , "%.*s/%s/" ,
2268+ (int )pmu_name_len , info .pmu_name , event -> terms );
2269+ buf_used += min (len + 1 , size_rem );
2270+ }
2271+
22482272 info .str = event -> terms ;
22492273 info .topic = event -> topic ;
22502274 info .deprecated = perf_pmu_alias__check_deprecated (pmu , event );
@@ -2254,7 +2278,7 @@ int perf_pmu__for_each_event(struct perf_pmu *pmu, bool skip_duplicate_pmus,
22542278 }
22552279 if (pmu -> selectable ) {
22562280 info .name = buf ;
2257- snprintf (buf , sizeof (buf ), "%s//" , pmu -> name );
2281+ scnprintf (buf , sizeof (buf ), "%s//" , pmu -> name );
22582282 info .alias = NULL ;
22592283 info .scale_unit = NULL ;
22602284 info .desc = NULL ;
0 commit comments