Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit a4c98367 authored by Namhyung Kim's avatar Namhyung Kim Committed by Arnaldo Carvalho de Melo
Browse files

perf tools: Get rid of malloc_or_die() in trace-event-read.c



Check return value of malloc() and fail if error.  Now read_string()
can return NULL also check its return value and bail out.

Signed-off-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Steven Rostedt <rostedt@goodmis.org>
Link: http://lkml.kernel.org/r/1363850332-25297-7-git-send-email-namhyung@kernel.org


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 3dce2ce3
Loading
Loading
Loading
Loading
+67 −33
Original line number Original line Diff line number Diff line
@@ -46,16 +46,6 @@ static int long_size;
static ssize_t calc_data_size;
static ssize_t calc_data_size;
static bool repipe;
static bool repipe;


static void *malloc_or_die(int size)
{
	void *ret;

	ret = malloc(size);
	if (!ret)
		die("malloc");
	return ret;
}

static int do_read(int fd, void *buf, int size)
static int do_read(int fd, void *buf, int size)
{
{
	int rsize = size;
	int rsize = size;
@@ -156,48 +146,57 @@ static char *read_string(void)
	if (calc_data_size)
	if (calc_data_size)
		calc_data_size += size;
		calc_data_size += size;


	str = malloc_or_die(size);
	str = malloc(size);
	if (str)
		memcpy(str, buf, size);
		memcpy(str, buf, size);


	return str;
	return str;
}
}


static void read_proc_kallsyms(struct pevent *pevent)
static int read_proc_kallsyms(struct pevent *pevent)
{
{
	unsigned int size;
	unsigned int size;
	char *buf;
	char *buf;


	size = read4(pevent);
	size = read4(pevent);
	if (!size)
	if (!size)
		return;
		return 0;

	buf = malloc(size + 1);
	if (buf == NULL)
		return -1;


	buf = malloc_or_die(size + 1);
	read_or_die(buf, size);
	read_or_die(buf, size);
	buf[size] = '\0';
	buf[size] = '\0';


	parse_proc_kallsyms(pevent, buf, size);
	parse_proc_kallsyms(pevent, buf, size);


	free(buf);
	free(buf);
	return 0;
}
}


static void read_ftrace_printk(struct pevent *pevent)
static int read_ftrace_printk(struct pevent *pevent)
{
{
	unsigned int size;
	unsigned int size;
	char *buf;
	char *buf;


	size = read4(pevent);
	size = read4(pevent);
	if (!size)
	if (!size)
		return;
		return 0;

	buf = malloc(size);
	if (buf == NULL)
		return -1;


	buf = malloc_or_die(size);
	read_or_die(buf, size);
	read_or_die(buf, size);


	parse_ftrace_printk(pevent, buf, size);
	parse_ftrace_printk(pevent, buf, size);


	free(buf);
	free(buf);
	return 0;
}
}


static void read_header_files(struct pevent *pevent)
static int read_header_files(struct pevent *pevent)
{
{
	unsigned long long size;
	unsigned long long size;
	char *header_event;
	char *header_event;
@@ -222,65 +221,87 @@ static void read_header_files(struct pevent *pevent)
		die("did not read header event");
		die("did not read header event");


	size = read8(pevent);
	size = read8(pevent);
	header_event = malloc_or_die(size);
	header_event = malloc(size);
	if (header_event == NULL)
		return -1;

	read_or_die(header_event, size);
	read_or_die(header_event, size);
	free(header_event);
	free(header_event);
	return 0;
}
}


static void read_ftrace_file(struct pevent *pevent, unsigned long long size)
static int read_ftrace_file(struct pevent *pevent, unsigned long long size)
{
{
	char *buf;
	char *buf;


	buf = malloc_or_die(size);
	buf = malloc(size);
	if (buf == NULL)
		return -1;

	read_or_die(buf, size);
	read_or_die(buf, size);
	parse_ftrace_file(pevent, buf, size);
	parse_ftrace_file(pevent, buf, size);
	free(buf);
	free(buf);
	return 0;
}
}


static void read_event_file(struct pevent *pevent, char *sys,
static int read_event_file(struct pevent *pevent, char *sys,
			    unsigned long long size)
			    unsigned long long size)
{
{
	char *buf;
	char *buf;


	buf = malloc_or_die(size);
	buf = malloc(size);
	if (buf == NULL)
		return -1;

	read_or_die(buf, size);
	read_or_die(buf, size);
	parse_event_file(pevent, buf, size, sys);
	parse_event_file(pevent, buf, size, sys);
	free(buf);
	free(buf);
	return 0;
}
}


static void read_ftrace_files(struct pevent *pevent)
static int read_ftrace_files(struct pevent *pevent)
{
{
	unsigned long long size;
	unsigned long long size;
	int count;
	int count;
	int i;
	int i;
	int ret;


	count = read4(pevent);
	count = read4(pevent);


	for (i = 0; i < count; i++) {
	for (i = 0; i < count; i++) {
		size = read8(pevent);
		size = read8(pevent);
		read_ftrace_file(pevent, size);
		ret = read_ftrace_file(pevent, size);
		if (ret)
			return ret;
	}
	}
	return 0;
}
}


static void read_event_files(struct pevent *pevent)
static int read_event_files(struct pevent *pevent)
{
{
	unsigned long long size;
	unsigned long long size;
	char *sys;
	char *sys;
	int systems;
	int systems;
	int count;
	int count;
	int i,x;
	int i,x;
	int ret;


	systems = read4(pevent);
	systems = read4(pevent);


	for (i = 0; i < systems; i++) {
	for (i = 0; i < systems; i++) {
		sys = read_string();
		sys = read_string();
		if (sys == NULL)
			return -1;


		count = read4(pevent);
		count = read4(pevent);
		for (x=0; x < count; x++) {
		for (x=0; x < count; x++) {
			size = read8(pevent);
			size = read8(pevent);
			read_event_file(pevent, sys, size);
			ret = read_event_file(pevent, sys, size);
			if (ret)
				return ret;
		}
		}
	}
	}
	return 0;
}
}


ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
ssize_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)
	int show_printk = 0;
	int show_printk = 0;
	ssize_t size = -1;
	ssize_t size = -1;
	struct pevent *pevent;
	struct pevent *pevent;
	int err;


	*ppevent = NULL;
	*ppevent = NULL;


@@ -310,6 +332,8 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)
		die("not a trace file (missing 'tracing' tag)");
		die("not a trace file (missing 'tracing' tag)");


	version = read_string();
	version = read_string();
	if (version == NULL)
		return -1;
	if (show_version)
	if (show_version)
		printf("version = %s\n", version);
		printf("version = %s\n", version);
	free(version);
	free(version);
@@ -329,11 +353,21 @@ ssize_t trace_report(int fd, struct pevent **ppevent, bool __repipe)


	page_size = read4(pevent);
	page_size = read4(pevent);


	read_header_files(pevent);
	err = read_header_files(pevent);
	read_ftrace_files(pevent);
	if (err)
	read_event_files(pevent);
		goto out;
	read_proc_kallsyms(pevent);
	err = read_ftrace_files(pevent);
	read_ftrace_printk(pevent);
	if (err)
		goto out;
	err = read_event_files(pevent);
	if (err)
		goto out;
	err = read_proc_kallsyms(pevent);
	if (err)
		goto out;
	err = read_ftrace_printk(pevent);
	if (err)
		goto out;


	size = calc_data_size - 1;
	size = calc_data_size - 1;
	calc_data_size = 0;
	calc_data_size = 0;