Messages in this thread | | | Date | Tue, 15 May 2012 20:24:42 -0600 | From | David Ahern <> | Subject | Re: [PATCH v2 2/5] perf tools: fix piped mode read code |
| |
On 5/15/12 5:28 AM, Stephane Eranian wrote: > In __perf_session__process_pipe_events(), there was a risk > we would read more than what a union perf_event struct can > hold. this could happen in case, perf is reading a file which > contains new record types it does not know about and which are > larger than anything it knows about. > > In general, perf is supposed to skip records it does not > understand, but in pipe mode, those have to be read and ignored. > The fixed size header contains the size of the record, but that > size may be larger than union perf_event, yet it was used as > the backing to the read in: > > union perf_event event; > void *p; > > size = event->header.size; > > p =&event; > p += sizeof(struct perf_event_header); > if (size - sizeof(struct perf_event_header)) { > err = readn(self->fd, p, size - sizeof(struct perf_event_header)); > > We fix this by allocating a buffer based on the size reported in > the header. We reuse the buffer as much as we can. We realloc in > case it becomes too small. In the common case, the performance > impact is negligible. > > Signed-off-by: Stephane Eranian<eranian@google.com> > --- > tools/perf/util/session.c | 34 ++++++++++++++++++++++++++-------- > 1 files changed, 26 insertions(+), 8 deletions(-) >
I don't have a file/perf with different sized events, but the change makes sense.
Reviewed-and-tested-by: David Ahern <dsahern@gmail.com>
| |