linux-kernel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Arnaldo Carvalho de Melo <acme@infradead.org>
To: Ingo Molnar <mingo@kernel.org>
Cc: linux-kernel@vger.kernel.org, Namhyung Kim <namhyung.kim@lge.com>,
	Namhyung Kim <namhyung@kernel.org>, Jiri Olsa <jolsa@redhat.com>,
	Paul Mackerras <paulus@samba.org>,
	Peter Zijlstra <a.p.zijlstra@chello.nl>,
	Stephane Eranian <eranian@google.com>,
	Arnaldo Carvalho de Melo <acme@redhat.com>
Subject: [PATCH 16/74] perf header: Ensure read/write finished successfully
Date: Thu, 24 Jan 2013 17:07:25 -0300	[thread overview]
Message-ID: <1359058103-31645-17-git-send-email-acme@infradead.org> (raw)
In-Reply-To: <1359058103-31645-1-git-send-email-acme@infradead.org>

From: Namhyung Kim <namhyung.kim@lge.com>

Use readn instead of read and check return value of do_write.

Signed-off-by: Namhyung Kim <namhyung@kernel.org>
Suggested-by: Arnaldo Carvalho de Melo <acme@ghostprotocols.net>
Acked-by: Jiri Olsa <jolsa@redhat.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Stephane Eranian <eranian@google.com>
Link: http://lkml.kernel.org/r/1355726345-29553-4-git-send-email-namhyung@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
---
 tools/perf/util/header.c | 63 +++++++++++++++++++++++++++---------------------
 1 file changed, 36 insertions(+), 27 deletions(-)

diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index b7da463..bb578d2 100644
--- a/tools/perf/util/header.c
+++ b/tools/perf/util/header.c
@@ -148,7 +148,7 @@ static char *do_read_string(int fd, struct perf_header *ph)
 	u32 len;
 	char *buf;
 
-	sz = read(fd, &len, sizeof(len));
+	sz = readn(fd, &len, sizeof(len));
 	if (sz < (ssize_t)sizeof(len))
 		return NULL;
 
@@ -159,7 +159,7 @@ static char *do_read_string(int fd, struct perf_header *ph)
 	if (!buf)
 		return NULL;
 
-	ret = read(fd, buf, len);
+	ret = readn(fd, buf, len);
 	if (ret == (ssize_t)len) {
 		/*
 		 * strings are padded by zeroes
@@ -1051,16 +1051,25 @@ static int write_pmu_mappings(int fd, struct perf_header *h __maybe_unused,
 	struct perf_pmu *pmu = NULL;
 	off_t offset = lseek(fd, 0, SEEK_CUR);
 	__u32 pmu_num = 0;
+	int ret;
 
 	/* write real pmu_num later */
-	do_write(fd, &pmu_num, sizeof(pmu_num));
+	ret = do_write(fd, &pmu_num, sizeof(pmu_num));
+	if (ret < 0)
+		return ret;
 
 	while ((pmu = perf_pmu__scan(pmu))) {
 		if (!pmu->name)
 			continue;
 		pmu_num++;
-		do_write(fd, &pmu->type, sizeof(pmu->type));
-		do_write_string(fd, pmu->name);
+
+		ret = do_write(fd, &pmu->type, sizeof(pmu->type));
+		if (ret < 0)
+			return ret;
+
+		ret = do_write_string(fd, pmu->name);
+		if (ret < 0)
+			return ret;
 	}
 
 	if (pwrite(fd, &pmu_num, sizeof(pmu_num), offset) != sizeof(pmu_num)) {
@@ -1209,14 +1218,14 @@ read_event_desc(struct perf_header *ph, int fd)
 	size_t msz;
 
 	/* number of events */
-	ret = read(fd, &nre, sizeof(nre));
+	ret = readn(fd, &nre, sizeof(nre));
 	if (ret != (ssize_t)sizeof(nre))
 		goto error;
 
 	if (ph->needs_swap)
 		nre = bswap_32(nre);
 
-	ret = read(fd, &sz, sizeof(sz));
+	ret = readn(fd, &sz, sizeof(sz));
 	if (ret != (ssize_t)sizeof(sz))
 		goto error;
 
@@ -1244,7 +1253,7 @@ read_event_desc(struct perf_header *ph, int fd)
 		 * must read entire on-file attr struct to
 		 * sync up with layout.
 		 */
-		ret = read(fd, buf, sz);
+		ret = readn(fd, buf, sz);
 		if (ret != (ssize_t)sz)
 			goto error;
 
@@ -1253,7 +1262,7 @@ read_event_desc(struct perf_header *ph, int fd)
 
 		memcpy(&evsel->attr, buf, msz);
 
-		ret = read(fd, &nr, sizeof(nr));
+		ret = readn(fd, &nr, sizeof(nr));
 		if (ret != (ssize_t)sizeof(nr))
 			goto error;
 
@@ -1274,7 +1283,7 @@ read_event_desc(struct perf_header *ph, int fd)
 		evsel->id = id;
 
 		for (j = 0 ; j < nr; j++) {
-			ret = read(fd, id, sizeof(*id));
+			ret = readn(fd, id, sizeof(*id));
 			if (ret != (ssize_t)sizeof(*id))
 				goto error;
 			if (ph->needs_swap)
@@ -1506,14 +1515,14 @@ static int perf_header__read_build_ids_abi_quirk(struct perf_header *header,
 	while (offset < limit) {
 		ssize_t len;
 
-		if (read(input, &old_bev, sizeof(old_bev)) != sizeof(old_bev))
+		if (readn(input, &old_bev, sizeof(old_bev)) != sizeof(old_bev))
 			return -1;
 
 		if (header->needs_swap)
 			perf_event_header__bswap(&old_bev.header);
 
 		len = old_bev.header.size - sizeof(old_bev);
-		if (read(input, filename, len) != len)
+		if (readn(input, filename, len) != len)
 			return -1;
 
 		bev.header = old_bev.header;
@@ -1548,14 +1557,14 @@ static int perf_header__read_build_ids(struct perf_header *header,
 	while (offset < limit) {
 		ssize_t len;
 
-		if (read(input, &bev, sizeof(bev)) != sizeof(bev))
+		if (readn(input, &bev, sizeof(bev)) != sizeof(bev))
 			goto out;
 
 		if (header->needs_swap)
 			perf_event_header__bswap(&bev.header);
 
 		len = bev.header.size - sizeof(bev);
-		if (read(input, filename, len) != len)
+		if (readn(input, filename, len) != len)
 			goto out;
 		/*
 		 * The a1645ce1 changeset:
@@ -1641,7 +1650,7 @@ static int process_nrcpus(struct perf_file_section *section __maybe_unused,
 	size_t ret;
 	u32 nr;
 
-	ret = read(fd, &nr, sizeof(nr));
+	ret = readn(fd, &nr, sizeof(nr));
 	if (ret != sizeof(nr))
 		return -1;
 
@@ -1650,7 +1659,7 @@ static int process_nrcpus(struct perf_file_section *section __maybe_unused,
 
 	ph->env.nr_cpus_online = nr;
 
-	ret = read(fd, &nr, sizeof(nr));
+	ret = readn(fd, &nr, sizeof(nr));
 	if (ret != sizeof(nr))
 		return -1;
 
@@ -1684,7 +1693,7 @@ static int process_total_mem(struct perf_file_section *section __maybe_unused,
 	uint64_t mem;
 	size_t ret;
 
-	ret = read(fd, &mem, sizeof(mem));
+	ret = readn(fd, &mem, sizeof(mem));
 	if (ret != sizeof(mem))
 		return -1;
 
@@ -1756,7 +1765,7 @@ static int process_cmdline(struct perf_file_section *section __maybe_unused,
 	u32 nr, i;
 	struct strbuf sb;
 
-	ret = read(fd, &nr, sizeof(nr));
+	ret = readn(fd, &nr, sizeof(nr));
 	if (ret != sizeof(nr))
 		return -1;
 
@@ -1792,7 +1801,7 @@ static int process_cpu_topology(struct perf_file_section *section __maybe_unused
 	char *str;
 	struct strbuf sb;
 
-	ret = read(fd, &nr, sizeof(nr));
+	ret = readn(fd, &nr, sizeof(nr));
 	if (ret != sizeof(nr))
 		return -1;
 
@@ -1813,7 +1822,7 @@ static int process_cpu_topology(struct perf_file_section *section __maybe_unused
 	}
 	ph->env.sibling_cores = strbuf_detach(&sb, NULL);
 
-	ret = read(fd, &nr, sizeof(nr));
+	ret = readn(fd, &nr, sizeof(nr));
 	if (ret != sizeof(nr))
 		return -1;
 
@@ -1850,7 +1859,7 @@ static int process_numa_topology(struct perf_file_section *section __maybe_unuse
 	struct strbuf sb;
 
 	/* nr nodes */
-	ret = read(fd, &nr, sizeof(nr));
+	ret = readn(fd, &nr, sizeof(nr));
 	if (ret != sizeof(nr))
 		goto error;
 
@@ -1862,15 +1871,15 @@ static int process_numa_topology(struct perf_file_section *section __maybe_unuse
 
 	for (i = 0; i < nr; i++) {
 		/* node number */
-		ret = read(fd, &node, sizeof(node));
+		ret = readn(fd, &node, sizeof(node));
 		if (ret != sizeof(node))
 			goto error;
 
-		ret = read(fd, &mem_total, sizeof(u64));
+		ret = readn(fd, &mem_total, sizeof(u64));
 		if (ret != sizeof(u64))
 			goto error;
 
-		ret = read(fd, &mem_free, sizeof(u64));
+		ret = readn(fd, &mem_free, sizeof(u64));
 		if (ret != sizeof(u64))
 			goto error;
 
@@ -1909,7 +1918,7 @@ static int process_pmu_mappings(struct perf_file_section *section __maybe_unused
 	u32 type;
 	struct strbuf sb;
 
-	ret = read(fd, &pmu_num, sizeof(pmu_num));
+	ret = readn(fd, &pmu_num, sizeof(pmu_num));
 	if (ret != sizeof(pmu_num))
 		return -1;
 
@@ -1925,7 +1934,7 @@ static int process_pmu_mappings(struct perf_file_section *section __maybe_unused
 	strbuf_init(&sb, 128);
 
 	while (pmu_num) {
-		if (read(fd, &type, sizeof(type)) != sizeof(type))
+		if (readn(fd, &type, sizeof(type)) != sizeof(type))
 			goto error;
 		if (ph->needs_swap)
 			type = bswap_32(type);
@@ -2912,7 +2921,7 @@ int perf_event__process_tracing_data(union perf_event *event,
 				 session->repipe);
 	padding = PERF_ALIGN(size_read, sizeof(u64)) - size_read;
 
-	if (read(session->fd, buf, padding) < 0)
+	if (readn(session->fd, buf, padding) < 0)
 		die("reading input file");
 	if (session->repipe) {
 		int retw = write(STDOUT_FILENO, buf, padding);
-- 
1.8.1.1.361.gec3ae6e


  parent reply	other threads:[~2013-01-24 20:31 UTC|newest]

Thread overview: 76+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <1359058103-31645-1-git-send-email-acme@infradead.org>
2013-01-24 20:07 ` [PATCH 01/74] perf hists: Exchange order of comparing items when collapsing hists Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 02/74] perf hists: Link hist entries before inserting to an output tree Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 03/74] perf diff: Use internal rb tree for compute resort Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 04/74] perf test: Add a test case for hists__{match,link} Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 05/74] perf test: Remove leftover temp file left by one of the attr tests Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 06/74] perf tests: Adjust some message log levels to help diagnosing problems in " Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 07/74] perf evsel: Do missing feature fallbacks in just one place Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 08/74] perf evsel: Introduce event fallback method Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 09/74] perf evsel: Introduce perf_evsel__open_strerror method Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 10/74] perf test: Check for linking problems in the python binding Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 11/74] perf python: Fix breakage introduced by the test_attr infrastructure Arnaldo Carvalho de Melo
2013-01-29  4:06   ` Thomas Backlund
2013-01-24 20:07 ` [PATCH 12/74] perf tools: Add missing closedir in multi tracepoint processing Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 13/74] perf tools: Add support for wildcard in tracepoint system name Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 14/74] perf tests: Add event parsing test for '*:*' tracepoints Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 15/74] perf tests: Check python path on attr and binding test Arnaldo Carvalho de Melo
2013-01-24 20:07 ` Arnaldo Carvalho de Melo [this message]
2013-01-24 20:07 ` [PATCH 17/74] perf record: Don't pass host machine to guest synthesizer Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 18/74] perf hists: Rename hists__fprintf_nr_events to events_stats__fprintf Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 19/74] perf session: There is no need for a per session hists instance Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 20/74] perf machine: Introduce struct machines Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 21/74] perf tests: Fix PYTHONPATH for python-use test tracepoints Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 22/74] perf machine: Simplify accessing the host machine Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 23/74] perf kvm: Initialize file_name var to fix segfault Arnaldo Carvalho de Melo
2013-01-25  3:00   ` Xiao Guangrong
2013-01-24 20:07 ` [PATCH 24/74] perf tests: Add return states enum for tests Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 25/74] perf tests: Don't fail if a matching vmlinux isn't found, skip that test Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 26/74] perf tools: remove redundant checks from _sort__sym_cmp Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 27/74] perf kmem: use ARRAY_SIZE instead of reinventing it Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 28/74] perf script: " Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 29/74] uprobes: remove redundant check Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 30/74] perf ui/gtk: Factor out common browser routines Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 31/74] perf ui/gtk: Setup browser window early Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 32/74] tools lib traceevent: test correct variable after allocation Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 33/74] tools lib traceevent: Update FSF postal address to be URL's Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 34/74] tools lib traceevent: Add copyright header Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 35/74] perf tools: Fix GNU make v3.80 compatibility issue Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 36/74] perf tools: Fix possible (unlikely) buffer overflow Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 37/74] perf symbols: Include elf.h header regardless LIBELF_SUPPORT Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 38/74] perf bench: Flush stdout before starting bench suite Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 39/74] perf tools: Add anonymous huge page recognition Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 40/74] perf: Missing field in PERF_RECORD_SAMPLE documentation Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 41/74] perf probe: Allow of casting an array of char to string Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 42/74] perf sort: Move misplaced sort entry functions Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 43/74] perf sort: Get rid of unnecessary __maybe_unused Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 44/74] perf sort: Fix --sort pid output Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 45/74] perf sort: Align cpu column to right Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 46/74] perf sort: Calculate parent column width too Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 47/74] perf sort: Clean up sort__first_dimension setting Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 48/74] perf sort: Separate out branch stack specific sort keys Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 49/74] perf report: Update documentation for " Arnaldo Carvalho de Melo
2013-01-24 20:07 ` [PATCH 50/74] perf symbols: Move name malloc to when needed in dso__load Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 51/74] perf symbols: Mark vmlinux filename as allocated Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 52/74] perf tools: Move get_term_dimensions from top to util.c Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 53/74] perf annotate browser: Fix segfault when drawing out-of-bounds jumps Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 54/74] perf tools: Mark branch_info maps as referenced Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 55/74] perf tools: Remove unused 'unset' parameter from parse_events Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 56/74] tools lib traceevent: Fix warning on '>=' operator Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 57/74] perf tools: Get rid of unused include of config.mak Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 58/74] perf tools: Do not include PERF-VERSION-FILE to Makefile Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 59/74] perf tools: Fix PMU format parsing test failure Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 60/74] perf tools: Move ltrim() to util/string.c Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 61/74] perf tools: Fix usage of __ in parse_events_term struct Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 62/74] perf pmu: Fix usage of __ in struct names Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 63/74] perf ui browsers: " Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 64/74] perf tools: Fix usage of __ in event parsing " Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 65/74] perf tests: Use ARRAY_SIZE() were applicable Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 66/74] perf pmu: Privatize perf_pmu_{format,alias} structs Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 67/74] perf tools: Remove some needless die() calls from the main routine Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 68/74] perf tools: Reinstate 'signed' field flag for tracepoints Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 69/74] perf script: Don't display trace info when invoking scripts Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 70/74] perf script: hook up perf_scripting_context->pevent Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 71/74] perf script: Remove workqueue-stats script Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 72/74] perf tools: Allow passing NULL to intlist__find Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 73/74] perf tools: Allow passing a list to intlist__new Arnaldo Carvalho de Melo
2013-01-24 20:08 ` [PATCH 74/74] perf test: Allow skipping tests Arnaldo Carvalho de Melo

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1359058103-31645-17-git-send-email-acme@infradead.org \
    --to=acme@infradead.org \
    --cc=a.p.zijlstra@chello.nl \
    --cc=acme@redhat.com \
    --cc=eranian@google.com \
    --cc=jolsa@redhat.com \
    --cc=linux-kernel@vger.kernel.org \
    --cc=mingo@kernel.org \
    --cc=namhyung.kim@lge.com \
    --cc=namhyung@kernel.org \
    --cc=paulus@samba.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).