diff options
author | Stephane Eranian <eranian@google.com> | 2012-02-09 23:21:07 +0100 |
---|---|---|
committer | Ingo Molnar <mingo@elte.hu> | 2012-03-09 08:26:06 +0100 |
commit | 62db90681c0db8c76e5db006b929a2edd5d12ae6 (patch) | |
tree | 9a758f8c9c41b34ae96533571a132b226819803f /tools/perf/util/header.c | |
parent | 69996df486fc3921bbaaa17fca0d68f537f9eabf (diff) | |
download | lwn-62db90681c0db8c76e5db006b929a2edd5d12ae6.tar.gz lwn-62db90681c0db8c76e5db006b929a2edd5d12ae6.zip |
perf tools: Fix ABI compatibility bug in print_event_desc()
This patches cleans up local variable types for msz and ret.
They need to be size_t and ssize_t respectively.
It also fixes a bug whereby perf would not read attr struct
with a different size than what it knows about.
Signed-off-by: Stephane Eranian <eranian@google.com>
Cc: peterz@infradead.org
Cc: acme@redhat.com
Cc: robert.richter@amd.com
Cc: ming.m.lin@intel.com
Cc: andi@firstfloor.org
Cc: asharma@fb.com
Cc: ravitillo@lbl.gov
Cc: vweaver1@eecs.utk.edu
Cc: khandual@linux.vnet.ibm.com
Cc: dsahern@gmail.com
Link: http://lkml.kernel.org/r/1328826068-11713-18-git-send-email-eranian@google.com
Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'tools/perf/util/header.c')
-rw-r--r-- | tools/perf/util/header.c | 19 |
1 files changed, 9 insertions, 10 deletions
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 666f18972fa3..6d580267d043 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -1144,8 +1144,9 @@ static void print_event_desc(struct perf_header *ph, int fd, FILE *fp) uint64_t id; void *buf = NULL; char *str; - u32 nre, sz, nr, i, j, msz; - int ret; + u32 nre, sz, nr, i, j; + ssize_t ret; + size_t msz; /* number of events */ ret = read(fd, &nre, sizeof(nre)); @@ -1162,25 +1163,23 @@ static void print_event_desc(struct perf_header *ph, int fd, FILE *fp) if (ph->needs_swap) sz = bswap_32(sz); - /* - * ensure it is at least to our ABI rev - */ - if (sz < (u32)sizeof(attr)) - goto error; - memset(&attr, 0, sizeof(attr)); - /* read entire region to sync up to next field */ + /* buffer to hold on file attr struct */ buf = malloc(sz); if (!buf) goto error; msz = sizeof(attr); - if (sz < msz) + if (sz < (ssize_t)msz) msz = sz; for (i = 0 ; i < nre; i++) { + /* + * must read entire on-file attr struct to + * sync up with layout. + */ ret = read(fd, buf, sz); if (ret != (ssize_t)sz) goto error; |