diff options
-rw-r--r-- | tools/perf/builtin-record.c | 5 | ||||
-rw-r--r-- | tools/perf/util/header.c | 30 | ||||
-rw-r--r-- | tools/perf/util/header.h | 6 |
3 files changed, 30 insertions, 11 deletions
diff --git a/tools/perf/builtin-record.c b/tools/perf/builtin-record.c index 4c03bb7a4eba..5411be4cfd77 100644 --- a/tools/perf/builtin-record.c +++ b/tools/perf/builtin-record.c | |||
@@ -221,7 +221,10 @@ static struct perf_header_attr *get_header_attr(struct perf_event_attr *a, int n | |||
221 | } else { | 221 | } else { |
222 | h_attr = perf_header_attr__new(a); | 222 | h_attr = perf_header_attr__new(a); |
223 | if (h_attr != NULL) | 223 | if (h_attr != NULL) |
224 | perf_header__add_attr(header, h_attr); | 224 | if (perf_header__add_attr(header, h_attr) < 0) { |
225 | perf_header_attr__delete(h_attr); | ||
226 | h_attr = NULL; | ||
227 | } | ||
225 | } | 228 | } |
226 | 229 | ||
227 | return h_attr; | 230 | return h_attr; |
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index 2f07a238ffdf..23ccddae0b06 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c | |||
@@ -33,6 +33,12 @@ struct perf_header_attr *perf_header_attr__new(struct perf_event_attr *attr) | |||
33 | return self; | 33 | return self; |
34 | } | 34 | } |
35 | 35 | ||
36 | void perf_header_attr__delete(struct perf_header_attr *self) | ||
37 | { | ||
38 | free(self->id); | ||
39 | free(self); | ||
40 | } | ||
41 | |||
36 | void perf_header_attr__add_id(struct perf_header_attr *self, u64 id) | 42 | void perf_header_attr__add_id(struct perf_header_attr *self, u64 id) |
37 | { | 43 | { |
38 | int pos = self->ids; | 44 | int pos = self->ids; |
@@ -66,22 +72,28 @@ struct perf_header *perf_header__new(void) | |||
66 | return self; | 72 | return self; |
67 | } | 73 | } |
68 | 74 | ||
69 | void perf_header__add_attr(struct perf_header *self, | 75 | int perf_header__add_attr(struct perf_header *self, |
70 | struct perf_header_attr *attr) | 76 | struct perf_header_attr *attr) |
71 | { | 77 | { |
72 | int pos = self->attrs; | 78 | int pos = self->attrs; |
73 | 79 | ||
74 | if (self->frozen) | 80 | if (self->frozen) |
75 | die("frozen"); | 81 | return -1; |
76 | 82 | ||
77 | self->attrs++; | 83 | self->attrs++; |
78 | if (self->attrs > self->size) { | 84 | if (self->attrs > self->size) { |
79 | self->size *= 2; | 85 | int nsize = self->size * 2; |
80 | self->attr = realloc(self->attr, self->size * sizeof(void *)); | 86 | struct perf_header_attr **nattr; |
81 | if (!self->attr) | 87 | |
82 | die("nomem"); | 88 | nattr = realloc(self->attr, nsize * sizeof(void *)); |
89 | if (nattr == NULL) | ||
90 | return -1; | ||
91 | |||
92 | self->size = nsize; | ||
93 | self->attr = nattr; | ||
83 | } | 94 | } |
84 | self->attr[pos] = attr; | 95 | self->attr[pos] = attr; |
96 | return 0; | ||
85 | } | 97 | } |
86 | 98 | ||
87 | #define MAX_EVENT_NAME 64 | 99 | #define MAX_EVENT_NAME 64 |
@@ -434,7 +446,9 @@ struct perf_header *perf_header__read(int fd) | |||
434 | 446 | ||
435 | perf_header_attr__add_id(attr, f_id); | 447 | perf_header_attr__add_id(attr, f_id); |
436 | } | 448 | } |
437 | perf_header__add_attr(self, attr); | 449 | if (perf_header__add_attr(self, attr) < 0) |
450 | die("nomem"); | ||
451 | |||
438 | lseek(fd, tmp, SEEK_SET); | 452 | lseek(fd, tmp, SEEK_SET); |
439 | } | 453 | } |
440 | 454 | ||
diff --git a/tools/perf/util/header.h b/tools/perf/util/header.h index 0cbd4c9e982c..b0d5cd707a7b 100644 --- a/tools/perf/util/header.h +++ b/tools/perf/util/header.h | |||
@@ -58,13 +58,15 @@ struct perf_header { | |||
58 | struct perf_header *perf_header__read(int fd); | 58 | struct perf_header *perf_header__read(int fd); |
59 | void perf_header__write(struct perf_header *self, int fd, bool at_exit); | 59 | void perf_header__write(struct perf_header *self, int fd, bool at_exit); |
60 | 60 | ||
61 | void perf_header__add_attr(struct perf_header *self, | 61 | int perf_header__add_attr(struct perf_header *self, |
62 | struct perf_header_attr *attr); | 62 | struct perf_header_attr *attr); |
63 | 63 | ||
64 | void perf_header__push_event(u64 id, const char *name); | 64 | void perf_header__push_event(u64 id, const char *name); |
65 | char *perf_header__find_event(u64 id); | 65 | char *perf_header__find_event(u64 id); |
66 | 66 | ||
67 | struct perf_header_attr *perf_header_attr__new(struct perf_event_attr *attr); | 67 | struct perf_header_attr *perf_header_attr__new(struct perf_event_attr *attr); |
68 | void perf_header_attr__delete(struct perf_header_attr *self); | ||
69 | |||
68 | void perf_header_attr__add_id(struct perf_header_attr *self, u64 id); | 70 | void perf_header_attr__add_id(struct perf_header_attr *self, u64 id); |
69 | 71 | ||
70 | u64 perf_header__sample_type(struct perf_header *header); | 72 | u64 perf_header__sample_type(struct perf_header *header); |