perf pmu: Add proper error handling to print_pmu_events()
tip-bot for Arnaldo Carvalho de Melo
merge botCommit-ID: 7e4772dc99a3ebfc53708eff262f7a8155485e85 Gitweb: http://git.kernel.org/tip/7e4772dc99a3ebfc53708eff262f7a8155485e85 Author: Arnaldo Carvalho de Melo <[email protected]> AuthorDate: Fri, 24 Oct 2014 10:25:09 -0300 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Wed, 29 Oct 2014 10:32:48 -0200
perf pmu: Add proper error handling to print_pmu_events()
It was silently returning or printing "(null)" when no memory was available at various points. Fix it by checking and warning the user when that happens.
Cc Adrian Hunter <[email protected]>
Cc Borislav Petkov <[email protected]>
Cc David Ahern <[email protected]>
Cc Don Zickus <[email protected]>
Cc Frederic Weisbecker <[email protected]>
Cc Jean Pihet <[email protected]>
Cc Jiri Olsa <[email protected]>
Cc Mike Galbraith <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Paul Mackerras <[email protected]>
Cc Peter Zijlstra <[email protected]>
Cc Stephane Eranian <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/pmu.c | 32 ++++++++++++++++++++++---------- 1 file changed, 22 insertions(+), 10 deletions(-)
tools/perf/util/pmu.c +22 -10
@@ -753,9 +753,9 @@ void print_pmu_events(const char *event_glob, bool name_only)if (pmu->selectable) len++; } - aliases =malloc (sizeof (char *) * len); + aliases =zalloc (sizeof (char *) * len);if (!aliases) -return ; + goto out_enomem; pmu =NULL ; j =0 ;while ((pmu =perf_pmu__scan (pmu)) !=NULL ) {
@@ -768,16 +768,20 @@ void print_pmu_events(const char *event_glob, bool name_only) (!is_cpu &&strglobmatch (alias->name, event_glob)))) continue; - aliases[j] = name; +if (is_cpu && !name_only) - aliases[j] =format_alias_or (buf,sizeof (buf), - pmu, alias); - aliases[j] =strdup (aliases[j]); + name =format_alias_or (buf,sizeof (buf), pmu, alias); + + aliases[j] =strdup (name); +if (aliases[j] ==NULL ) + goto out_enomem; j++; }if (pmu->selectable) { -scnprintf (buf,sizeof (buf),"%s//" , pmu->name); - aliases[j] =strdup (buf); +char *s; +if (asprintf (&s,"%s//" , pmu->name) <0 ) + goto out_enomem; + aliases[j] = s; j++; } }
@@ -789,12 +793,20 @@ void print_pmu_events(const char *event_glob, bool name_only)continue ; }printf (" %-50s [Kernel PMU event]\n" , aliases[j]); -zfree (&aliases[j]); printed++; }if (printed)printf ("\n" ); -free (aliases); +out_free: +for (j =0 ; j < len; j++) +zfree (&aliases[j]); +zfree (&aliases); +return ; + +out_enomem: +printf ("FATAL: not enough memory to print PMU events\n" ); +if (aliases) + goto out_free; }bool pmu_have_event (const char *pname,const char *name)