aboutsummaryrefslogtreecommitdiffstats
path: root/tools/perf
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf')
-rw-r--r--tools/perf/util/trace-event-read.c100
1 files changed, 67 insertions, 33 deletions
diff --git a/tools/perf/util/trace-event-read.c b/tools/perf/util/trace-event-read.c
index ba752d765ac3..22ded8000ef6 100644
--- a/tools/perf/util/trace-event-read.c
+++ b/tools/perf/util/trace-event-read.c
@@ -46,16 +46,6 @@ static int long_size;
46static ssize_t calc_data_size; 46static ssize_t calc_data_size;
47static bool repipe; 47static bool repipe;
48 48
49static void *malloc_or_die(int size)
50{
51 void *ret;
52
53 ret = malloc(size);
54 if (!ret)
55 die("malloc");
56 return ret;
57}
58
59static int do_read(int fd, void *buf, int size) 49static int do_read(int fd, void *buf, int size)
60{ 50{
61 int rsize = size; 51 int rsize = size;
@@ -156,48 +146,57 @@ static char *read_string(void)
156 if (calc_data_size) 146 if (calc_data_size)
157 calc_data_size += size; 147 calc_data_size += size;
158 148
159 str = malloc_or_die(size); 149 str = malloc(size);
160 memcpy(str, buf, size); 150 if (str)
151 memcpy(str, buf, size);
161 152
162 return str; 153 return str;
163} 154}
164 155
165static void read_proc_kallsyms(struct pevent *pevent) 156static int read_proc_kallsyms(struct pevent *pevent)
166{ 157{
167 unsigned int size; 158 unsigned int size;
168 char *buf; 159 char *buf;
169 160
170 size = read4(pevent); 161 size = read4(pevent);
171 if (!size) 162 if (!size)
172 return; 163 return 0;
164
165 buf = malloc(size + 1);
166 if (buf == NULL)
167 return -1;
173 168
174 buf = malloc_or_die(size + 1);
175 read_or_die(buf, size); 169 read_or_die(buf, size);
176 buf[size] = '\0'; 170 buf[size] = '\0';
177 171
178 parse_proc_kallsyms(pevent, buf, size); 172 parse_proc_kallsyms(pevent, buf, size);
179 173
180 free(buf); 174 free(buf);
175 return 0;
181} 176}
182 177
183static void read_ftrace_printk(struct pevent *pevent) 178static int read_ftrace_printk(struct pevent *pevent)
184{ 179{
185 unsigned int size; 180 unsigned int size;
186 char *buf; 181 char *buf;
187 182
188 size = read4(pevent); 183 size = read4(pevent);
189 if (!size) 184 if (!size)
190 return; 185 return 0;
186
187 buf = malloc(size);
188 if (buf == NULL)
189 return -1;
191 190
192 buf = malloc_or_die(size);
193 read_or_die(buf, size); 191 read_or_die(buf, size);
194 192
195 parse_ftrace_printk(pevent, buf, size); 193 parse_ftrace_printk(pevent, buf, size);
196 194
197 free(buf); 195 free(buf);
196 return 0;
198} 197}
199 198
200static void read_header_files(struct pevent *pevent) 199static int read_header_files(struct pevent *pevent)
201{ 200{
202 unsigned long long size; 201 unsigned long long size;
203 char *header_event; 202 char *header_event;
@@ -222,65 +221,87 @@ static void read_header_files(struct pevent *pevent)
222 die("did not read header event"); 221 die("did not read header event");
223 222
224 size = read8(pevent); 223 size = read8(pevent);
225 header_event = malloc_or_die(size); 224 header_event = malloc(size);
225 if (header_event == NULL)
226 return -1;
227
226 read_or_die(header_event, size); 228 read_or_die(header_event, size);
227 free(header_event); 229 free(header_event);
230 return 0;
228} 231}
229 232
230static void read_ftrace_file(struct pevent *pevent, unsigned long long size) 233static int read_ftrace_file(struct pevent *pevent, unsigned long long size)
231{ 234{
232 char *buf; 235 char *buf;
233 236
234 buf = malloc_or_die(size); 237 buf = malloc(size);
238 if (buf == NULL)
239 return -1;
240
235 read_or_die(buf, size); 241 read_or_die(buf, size);
236 parse_ftrace_file(pevent, buf, size); 242 parse_ftrace_file(pevent, buf, size);
237 free(buf); 243 free(buf);
244 return 0;
238} 245}
239 246
240static void read_event_file(struct pevent *pevent, char *sys, 247static int read_event_file(struct pevent *pevent, char *sys,
241 unsigned long long size) 248 unsigned long long size)
242{ 249{
243 char *buf; 250 char *buf;
244 251
245 buf = malloc_or_die(size); 252 buf = malloc(size);
253 if (buf == NULL)
254 return -1;
255
246 read_or_die(buf, size); 256 read_or_die(buf, size);
247 parse_event_file(pevent, buf, size, sys); 257 parse_event_file(pevent, buf, size, sys);
248 free(buf); 258 free(buf);
259 return 0;
249} 260}
250 261
251static void read_ftrace_files(struct pevent *pevent) 262static int read_ftrace_files(struct pevent *pevent)
252{ 263{
253 unsigned long long size; 264 unsigned long long size;
254 int count; 265 int count;
255 int i; 266 int i;
267 int ret;
256 268
257 count = read4(pevent); 269 count = read4(pevent);
258 270
259 for (i = 0; i < count; i++) { 271 for (i = 0; i < count; i++) {
260 size = read8(pevent); 272 size = read8(pevent);
261 read_ftrace_file(pevent, size); 273 ret = read_ftrace_file(pevent, size);
274 if (ret)
275 return ret;
262 } 276 }
277 return 0;
263} 278}
264 279
265static void read_event_files(struct pevent *pevent) 280static int read_event_files(struct pevent *pevent)
266{ 281{
267 unsigned long long size; 282 unsigned long long size;
268 char *sys; 283 char *sys;
269 int systems; 284 int systems;
270 int count; 285 int count;
271 int i,x; 286 int i,x;
287 int ret;
272 288
273 systems = read4(pevent); 289 systems = read4(pevent);
274 290
275 for (i = 0; i < systems; i++) { 291 for (i = 0; i < systems; i++) {
276 sys = read_string(); 292 sys = read_string();
293 if (sys == NULL)
294 return -1;
277 295
278 count = read4(pevent); 296 count = read4(pevent);
279 for (x=0; x < count; x++) { 297 for (x=0; x < count; x++) {
280 size = read8(pevent); 298 size = read8(pevent);
281 read_event_file(pevent, sys, size); 299 ret = read_event_file(pevent, sys, size);
300 if (ret)
301 return ret;
282 } 302 }
283 } 303 }
304 return 0;
284} 305}
285 306
286ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe) 307ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
@@ -293,6 +314,7 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
293 int show_printk = 0; 314 int show_printk = 0;
294 ssize_t size = -1; 315 ssize_t size = -1;
295 struct pevent *pevent; 316 struct pevent *pevent;
317 int err;
296 318
297 *ppevent = NULL; 319 *ppevent = NULL;
298 320
@@ -310,6 +332,8 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
310 die("not a trace file (missing 'tracing' tag)"); 332 die("not a trace file (missing 'tracing' tag)");
311 333
312 version = read_string(); 334 version = read_string();
335 if (version == NULL)
336 return -1;
313 if (show_version) 337 if (show_version)
314 printf("version = %s\n", version); 338 printf("version = %s\n", version);
315 free(version); 339 free(version);
@@ -329,11 +353,21 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
329 353
330 page_size = read4(pevent); 354 page_size = read4(pevent);
331 355
332 read_header_files(pevent); 356 err = read_header_files(pevent);
333 read_ftrace_files(pevent); 357 if (err)
334 read_event_files(pevent); 358 goto out;
335 read_proc_kallsyms(pevent); 359 err = read_ftrace_files(pevent);
336 read_ftrace_printk(pevent); 360 if (err)
361 goto out;
362 err = read_event_files(pevent);
363 if (err)
364 goto out;
365 err = read_proc_kallsyms(pevent);
366 if (err)
367 goto out;
368 err = read_ftrace_printk(pevent);
369 if (err)
370 goto out;
337 371
338 size = calc_data_size - 1; 372 size = calc_data_size - 1;
339 calc_data_size = 0; 373 calc_data_size = 0;