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

Commit 642aadaa authored by Masami Hiramatsu's avatar Masami Hiramatsu Committed by Arnaldo Carvalho de Melo
Browse files

perf header: Make topology checkers to check return value of strbuf



Make topology checkers to check the return value of strbuf APIs so that
it can detect errors in it.

Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20160510054735.6158.98650.stgit@devbox


Signed-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent 70a6898f
Loading
Loading
Loading
Loading
+20 −11
Original line number Original line Diff line number Diff line
@@ -1819,7 +1819,8 @@ static int process_cpu_topology(struct perf_file_section *section,


	ph->env.nr_sibling_cores = nr;
	ph->env.nr_sibling_cores = nr;
	size += sizeof(u32);
	size += sizeof(u32);
	strbuf_init(&sb, 128);
	if (strbuf_init(&sb, 128) < 0)
		goto free_cpu;


	for (i = 0; i < nr; i++) {
	for (i = 0; i < nr; i++) {
		str = do_read_string(fd, ph);
		str = do_read_string(fd, ph);
@@ -1827,7 +1828,8 @@ static int process_cpu_topology(struct perf_file_section *section,
			goto error;
			goto error;


		/* include a NULL character at the end */
		/* include a NULL character at the end */
		strbuf_add(&sb, str, strlen(str) + 1);
		if (strbuf_add(&sb, str, strlen(str) + 1) < 0)
			goto error;
		size += string_size(str);
		size += string_size(str);
		free(str);
		free(str);
	}
	}
@@ -1849,7 +1851,8 @@ static int process_cpu_topology(struct perf_file_section *section,
			goto error;
			goto error;


		/* include a NULL character at the end */
		/* include a NULL character at the end */
		strbuf_add(&sb, str, strlen(str) + 1);
		if (strbuf_add(&sb, str, strlen(str) + 1) < 0)
			goto error;
		size += string_size(str);
		size += string_size(str);
		free(str);
		free(str);
	}
	}
@@ -1912,13 +1915,14 @@ static int process_numa_topology(struct perf_file_section *section __maybe_unuse
	/* nr nodes */
	/* nr nodes */
	ret = readn(fd, &nr, sizeof(nr));
	ret = readn(fd, &nr, sizeof(nr));
	if (ret != sizeof(nr))
	if (ret != sizeof(nr))
		goto error;
		return -1;


	if (ph->needs_swap)
	if (ph->needs_swap)
		nr = bswap_32(nr);
		nr = bswap_32(nr);


	ph->env.nr_numa_nodes = nr;
	ph->env.nr_numa_nodes = nr;
	strbuf_init(&sb, 256);
	if (strbuf_init(&sb, 256) < 0)
		return -1;


	for (i = 0; i < nr; i++) {
	for (i = 0; i < nr; i++) {
		/* node number */
		/* node number */
@@ -1940,15 +1944,17 @@ static int process_numa_topology(struct perf_file_section *section __maybe_unuse
			mem_free = bswap_64(mem_free);
			mem_free = bswap_64(mem_free);
		}
		}


		strbuf_addf(&sb, "%u:%"PRIu64":%"PRIu64":",
		if (strbuf_addf(&sb, "%u:%"PRIu64":%"PRIu64":",
			    node, mem_total, mem_free);
				node, mem_total, mem_free) < 0)
			goto error;


		str = do_read_string(fd, ph);
		str = do_read_string(fd, ph);
		if (!str)
		if (!str)
			goto error;
			goto error;


		/* include a NULL character at the end */
		/* include a NULL character at the end */
		strbuf_add(&sb, str, strlen(str) + 1);
		if (strbuf_add(&sb, str, strlen(str) + 1) < 0)
			goto error;
		free(str);
		free(str);
	}
	}
	ph->env.numa_nodes = strbuf_detach(&sb, NULL);
	ph->env.numa_nodes = strbuf_detach(&sb, NULL);
@@ -1982,7 +1988,8 @@ static int process_pmu_mappings(struct perf_file_section *section __maybe_unused
	}
	}


	ph->env.nr_pmu_mappings = pmu_num;
	ph->env.nr_pmu_mappings = pmu_num;
	strbuf_init(&sb, 128);
	if (strbuf_init(&sb, 128) < 0)
		return -1;


	while (pmu_num) {
	while (pmu_num) {
		if (readn(fd, &type, sizeof(type)) != sizeof(type))
		if (readn(fd, &type, sizeof(type)) != sizeof(type))
@@ -1994,9 +2001,11 @@ static int process_pmu_mappings(struct perf_file_section *section __maybe_unused
		if (!name)
		if (!name)
			goto error;
			goto error;


		strbuf_addf(&sb, "%u:%s", type, name);
		if (strbuf_addf(&sb, "%u:%s", type, name) < 0)
			goto error;
		/* include a NULL character at the end */
		/* include a NULL character at the end */
		strbuf_add(&sb, "", 1);
		if (strbuf_add(&sb, "", 1) < 0)
			goto error;


		if (!strcmp(name, "msr"))
		if (!strcmp(name, "msr"))
			ph->env.msr_pmu_type = type;
			ph->env.msr_pmu_type = type;