perf fixes
Linus,
Please pull the latest perf-urgent-for-linus git tree from:
git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip.git perf-urgent-for-linus
HEAD: 5d85d97c9f6973ba854f35a2d5e80fe68272143e Merge tag 'perf-urgent-for-mingo' of git://git.kernel.org/pub/scm/linux/kernel/git/acme/linux into perf/urgent
Thanks,
Ingo
------------------>
David Ahern (1):
perf tools: Ensure comm string is properly terminated
Namhyung Kim (2):
perf/hwbp: Fix a possible memory leak
perf evlist: Return first evsel for non-sample event on old kernel
Prashanth Nageshappa (2):
perf probe: Ensure offset provided is not greater than function length
perf probe: Ensure offset provided is not greater than function length without DWARF info too
kernel/events/hw_breakpoint.c | 4 ++-- tools/perf/util/event.c | 1 + tools/perf/util/evlist.c | 4 ++++ tools/perf/util/probe-event.c | 6 ++++++ tools/perf/util/probe-finder.c | 12 +++++++++++- 5 files changed, 24 insertions(+), 3 deletions(-)
kernel/events/hw_breakpoint.c +2 -2
@@ -651,10 +651,10 @@ int __init init_hw_breakpoint(void) err_alloc:for_each_possible_cpu (err_cpu) { -if (err_cpu == cpu) -break ;for (i =0 ; i <TYPE_MAX ; i++)kfree (per_cpu (nr_task_bp_pinned[i], cpu)); +if (err_cpu == cpu) +break ; }return -ENOMEM ;
tools/perf/util/event.c +1 -0
@@ -74,6 +74,7 @@ static pid_t perf_event__get_comm_tgid(pid_t pid, char *comm, size_t len)if (size >= len) size = len -1 ;memcpy (comm, name, size); + comm[size] ='\0' ; }else if (memcmp (bf,"Tgid:" ,5 ) ==0 ) {char *tgids = bf +5 ;
tools/perf/util/evlist.c +4 -0
@@ -349,6 +349,10 @@ struct perf_evsel *perf_evlist__id2evsel(struct perf_evlist *evlist, u64 id)hlist_for_each_entry (sid, pos, head, node)if (sid->id == id)return sid->evsel; + +if (!perf_evlist__sample_id_all (evlist)) + return list_entry(evlist->entries.next, struct perf_evsel, node); +return NULL ; }
tools/perf/util/probe-event.c +6 -0
@@ -1867,6 +1867,12 @@ static int convert_to_probe_trace_events(struct perf_probe_event *pev, tev->point.symbol); ret = -ENOENT ; goto error; + }else if (tev->point.offset > sym->end - sym->start) { +pr_warning ("Offset specified is greater than size of %s\n" , + tev->point.symbol); + ret = -ENOENT ; + goto error; + }return 1 ;
tools/perf/util/probe-finder.c +11 -1
@@ -672,7 +672,7 @@ static int find_variable(Dwarf_Die *sc_die, struct probe_finder *pf)static int convert_to_trace_point (Dwarf_Die *sp_die,Dwarf_Addr paddr,bool retprobe,struct probe_trace_point *tp) { -Dwarf_Addr eaddr; +Dwarf_Addr eaddr, highaddr;const char *name;/* Copy the name of probe point */
@@ -683,6 +683,16 @@ static int convert_to_trace_point(Dwarf_Die *sp_die, Dwarf_Addr paddr, dwarf_diename(sp_die));return -ENOENT ; } +if (dwarf_highpc (sp_die, &highaddr) !=0 ) { +pr_warning ("Failed to get end address of %s\n" , +dwarf_diename (sp_die)); +return -ENOENT ; + } +if (paddr > highaddr) { +pr_warning ("Offset specified is greater than size of %s\n" , +dwarf_diename (sp_die)); +return -EINVAL ; + } tp->symbol =strdup (name);if (tp->symbol ==NULL )return -ENOMEM ;