aboutsummaryrefslogtreecommitdiffstats
path: root/tools
diff options
context:
space:
mode:
authorNamhyung Kim <namhyung.kim@lge.com>2012-12-17 01:38:54 -0500
committerArnaldo Carvalho de Melo <acme@redhat.com>2013-01-24 14:40:11 -0500
commit5323f60c7578e9ddc92d1ca8a2d7b08284624cd1 (patch)
tree90e1f5e48c55dec263502ca5707ad6dbb80a7541 /tools
parent000ae33fdb5ff7bc7ae985b43e6278024a4985c2 (diff)
perf header: Ensure read/write finished successfully
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>
Diffstat (limited to 'tools')
-rw-r--r--tools/perf/util/header.c63
1 files changed, 36 insertions, 27 deletions
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c
index b7da4634a047..bb578d2d10f9 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)
148 u32 len; 148 u32 len;
149 char *buf; 149 char *buf;
150 150
151 sz = read(fd, &len, sizeof(len)); 151 sz = readn(fd, &len, sizeof(len));
152 if (sz < (ssize_t)sizeof(len)) 152 if (sz < (ssize_t)sizeof(len))
153 return NULL; 153 return NULL;
154 154
@@ -159,7 +159,7 @@ static char *do_read_string(int fd, struct perf_header *ph)
159 if (!buf) 159 if (!buf)
160 return NULL; 160 return NULL;
161 161
162 ret = read(fd, buf, len); 162 ret = readn(fd, buf, len);
163 if (ret == (ssize_t)len) { 163 if (ret == (ssize_t)len) {
164 /* 164 /*
165 * strings are padded by zeroes 165 * strings are padded by zeroes
@@ -1051,16 +1051,25 @@ static int write_pmu_mappings(int fd, struct perf_header *h __maybe_unused,
1051 struct perf_pmu *pmu = NULL; 1051 struct perf_pmu *pmu = NULL;
1052 off_t offset = lseek(fd, 0, SEEK_CUR); 1052 off_t offset = lseek(fd, 0, SEEK_CUR);
1053 __u32 pmu_num = 0; 1053 __u32 pmu_num = 0;
1054 int ret;
1054 1055
1055 /* write real pmu_num later */ 1056 /* write real pmu_num later */
1056 do_write(fd, &pmu_num, sizeof(pmu_num)); 1057 ret = do_write(fd, &pmu_num, sizeof(pmu_num));
1058 if (ret < 0)
1059 return ret;
1057 1060
1058 while ((pmu = perf_pmu__scan(pmu))) { 1061 while ((pmu = perf_pmu__scan(pmu))) {
1059 if (!pmu->name) 1062 if (!pmu->name)
1060 continue; 1063 continue;
1061 pmu_num++; 1064 pmu_num++;
1062 do_write(fd, &pmu->type, sizeof(pmu->type)); 1065
1063 do_write_string(fd, pmu->name); 1066 ret = do_write(fd, &pmu->type, sizeof(pmu->type));
1067 if (ret < 0)
1068 return ret;
1069
1070 ret = do_write_string(fd, pmu->name);
1071 if (ret < 0)
1072 return ret;
1064 } 1073 }
1065 1074
1066 if (pwrite(fd, &pmu_num, sizeof(pmu_num), offset) != sizeof(pmu_num)) { 1075 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)
1209 size_t msz; 1218 size_t msz;
1210 1219
1211 /* number of events */ 1220 /* number of events */
1212 ret = read(fd, &nre, sizeof(nre)); 1221 ret = readn(fd, &nre, sizeof(nre));
1213 if (ret != (ssize_t)sizeof(nre)) 1222 if (ret != (ssize_t)sizeof(nre))
1214 goto error; 1223 goto error;
1215 1224
1216 if (ph->needs_swap) 1225 if (ph->needs_swap)
1217 nre = bswap_32(nre); 1226 nre = bswap_32(nre);
1218 1227
1219 ret = read(fd, &sz, sizeof(sz)); 1228 ret = readn(fd, &sz, sizeof(sz));
1220 if (ret != (ssize_t)sizeof(sz)) 1229 if (ret != (ssize_t)sizeof(sz))
1221 goto error; 1230 goto error;
1222 1231
@@ -1244,7 +1253,7 @@ read_event_desc(struct perf_header *ph, int fd)
1244 * must read entire on-file attr struct to 1253 * must read entire on-file attr struct to
1245 * sync up with layout. 1254 * sync up with layout.
1246 */ 1255 */
1247 ret = read(fd, buf, sz); 1256 ret = readn(fd, buf, sz);
1248 if (ret != (ssize_t)sz) 1257 if (ret != (ssize_t)sz)
1249 goto error; 1258 goto error;
1250 1259
@@ -1253,7 +1262,7 @@ read_event_desc(struct perf_header *ph, int fd)
1253 1262
1254 memcpy(&evsel->attr, buf, msz); 1263 memcpy(&evsel->attr, buf, msz);
1255 1264
1256 ret = read(fd, &nr, sizeof(nr)); 1265 ret = readn(fd, &nr, sizeof(nr));
1257 if (ret != (ssize_t)sizeof(nr)) 1266 if (ret != (ssize_t)sizeof(nr))
1258 goto error; 1267 goto error;
1259 1268
@@ -1274,7 +1283,7 @@ read_event_desc(struct perf_header *ph, int fd)
1274 evsel->id = id; 1283 evsel->id = id;
1275 1284
1276 for (j = 0 ; j < nr; j++) { 1285 for (j = 0 ; j < nr; j++) {
1277 ret = read(fd, id, sizeof(*id)); 1286 ret = readn(fd, id, sizeof(*id));
1278 if (ret != (ssize_t)sizeof(*id)) 1287 if (ret != (ssize_t)sizeof(*id))
1279 goto error; 1288 goto error;
1280 if (ph->needs_swap) 1289 if (ph->needs_swap)
@@ -1506,14 +1515,14 @@ static int perf_header__read_build_ids_abi_quirk(struct perf_header *header,
1506 while (offset < limit) { 1515 while (offset < limit) {
1507 ssize_t len; 1516 ssize_t len;
1508 1517
1509 if (read(input, &old_bev, sizeof(old_bev)) != sizeof(old_bev)) 1518 if (readn(input, &old_bev, sizeof(old_bev)) != sizeof(old_bev))
1510 return -1; 1519 return -1;
1511 1520
1512 if (header->needs_swap) 1521 if (header->needs_swap)
1513 perf_event_header__bswap(&old_bev.header); 1522 perf_event_header__bswap(&old_bev.header);
1514 1523
1515 len = old_bev.header.size - sizeof(old_bev); 1524 len = old_bev.header.size - sizeof(old_bev);
1516 if (read(input, filename, len) != len) 1525 if (readn(input, filename, len) != len)
1517 return -1; 1526 return -1;
1518 1527
1519 bev.header = old_bev.header; 1528 bev.header = old_bev.header;
@@ -1548,14 +1557,14 @@ static int perf_header__read_build_ids(struct perf_header *header,
1548 while (offset < limit) { 1557 while (offset < limit) {
1549 ssize_t len; 1558 ssize_t len;
1550 1559
1551 if (read(input, &bev, sizeof(bev)) != sizeof(bev)) 1560 if (readn(input, &bev, sizeof(bev)) != sizeof(bev))
1552 goto out; 1561 goto out;
1553 1562
1554 if (header->needs_swap) 1563 if (header->needs_swap)
1555 perf_event_header__bswap(&bev.header); 1564 perf_event_header__bswap(&bev.header);
1556 1565
1557 len = bev.header.size - sizeof(bev); 1566 len = bev.header.size - sizeof(bev);
1558 if (read(input, filename, len) != len) 1567 if (readn(input, filename, len) != len)
1559 goto out; 1568 goto out;
1560 /* 1569 /*
1561 * The a1645ce1 changeset: 1570 * The a1645ce1 changeset:
@@ -1641,7 +1650,7 @@ static int process_nrcpus(struct perf_file_section *section __maybe_unused,
1641 size_t ret; 1650 size_t ret;
1642 u32 nr; 1651 u32 nr;
1643 1652
1644 ret = read(fd, &nr, sizeof(nr)); 1653 ret = readn(fd, &nr, sizeof(nr));
1645 if (ret != sizeof(nr)) 1654 if (ret != sizeof(nr))
1646 return -1; 1655 return -1;
1647 1656
@@ -1650,7 +1659,7 @@ static int process_nrcpus(struct perf_file_section *section __maybe_unused,
1650 1659
1651 ph->env.nr_cpus_online = nr; 1660 ph->env.nr_cpus_online = nr;
1652 1661
1653 ret = read(fd, &nr, sizeof(nr)); 1662 ret = readn(fd, &nr, sizeof(nr));
1654 if (ret != sizeof(nr)) 1663 if (ret != sizeof(nr))
1655 return -1; 1664 return -1;
1656 1665
@@ -1684,7 +1693,7 @@ static int process_total_mem(struct perf_file_section *section __maybe_unused,
1684 uint64_t mem; 1693 uint64_t mem;
1685 size_t ret; 1694 size_t ret;
1686 1695
1687 ret = read(fd, &mem, sizeof(mem)); 1696 ret = readn(fd, &mem, sizeof(mem));
1688 if (ret != sizeof(mem)) 1697 if (ret != sizeof(mem))
1689 return -1; 1698 return -1;
1690 1699
@@ -1756,7 +1765,7 @@ static int process_cmdline(struct perf_file_section *section __maybe_unused,
1756 u32 nr, i; 1765 u32 nr, i;
1757 struct strbuf sb; 1766 struct strbuf sb;
1758 1767
1759 ret = read(fd, &nr, sizeof(nr)); 1768 ret = readn(fd, &nr, sizeof(nr));
1760 if (ret != sizeof(nr)) 1769 if (ret != sizeof(nr))
1761 return -1; 1770 return -1;
1762 1771
@@ -1792,7 +1801,7 @@ static int process_cpu_topology(struct perf_file_section *section __maybe_unused
1792 char *str; 1801 char *str;
1793 struct strbuf sb; 1802 struct strbuf sb;
1794 1803
1795 ret = read(fd, &nr, sizeof(nr)); 1804 ret = readn(fd, &nr, sizeof(nr));
1796 if (ret != sizeof(nr)) 1805 if (ret != sizeof(nr))
1797 return -1; 1806 return -1;
1798 1807
@@ -1813,7 +1822,7 @@ static int process_cpu_topology(struct perf_file_section *section __maybe_unused
1813 } 1822 }
1814 ph->env.sibling_cores = strbuf_detach(&sb, NULL); 1823 ph->env.sibling_cores = strbuf_detach(&sb, NULL);
1815 1824
1816 ret = read(fd, &nr, sizeof(nr)); 1825 ret = readn(fd, &nr, sizeof(nr));
1817 if (ret != sizeof(nr)) 1826 if (ret != sizeof(nr))
1818 return -1; 1827 return -1;
1819 1828
@@ -1850,7 +1859,7 @@ static int process_numa_topology(struct perf_file_section *section __maybe_unuse
1850 struct strbuf sb; 1859 struct strbuf sb;
1851 1860
1852 /* nr nodes */ 1861 /* nr nodes */
1853 ret = read(fd, &nr, sizeof(nr)); 1862 ret = readn(fd, &nr, sizeof(nr));
1854 if (ret != sizeof(nr)) 1863 if (ret != sizeof(nr))
1855 goto error; 1864 goto error;
1856 1865
@@ -1862,15 +1871,15 @@ static int process_numa_topology(struct perf_file_section *section __maybe_unuse
1862 1871
1863 for (i = 0; i < nr; i++) { 1872 for (i = 0; i < nr; i++) {
1864 /* node number */ 1873 /* node number */
1865 ret = read(fd, &node, sizeof(node)); 1874 ret = readn(fd, &node, sizeof(node));
1866 if (ret != sizeof(node)) 1875 if (ret != sizeof(node))
1867 goto error; 1876 goto error;
1868 1877
1869 ret = read(fd, &mem_total, sizeof(u64)); 1878 ret = readn(fd, &mem_total, sizeof(u64));
1870 if (ret != sizeof(u64)) 1879 if (ret != sizeof(u64))
1871 goto error; 1880 goto error;
1872 1881
1873 ret = read(fd, &mem_free, sizeof(u64)); 1882 ret = readn(fd, &mem_free, sizeof(u64));
1874 if (ret != sizeof(u64)) 1883 if (ret != sizeof(u64))
1875 goto error; 1884 goto error;
1876 1885
@@ -1909,7 +1918,7 @@ static int process_pmu_mappings(struct perf_file_section *section __maybe_unused
1909 u32 type; 1918 u32 type;
1910 struct strbuf sb; 1919 struct strbuf sb;
1911 1920
1912 ret = read(fd, &pmu_num, sizeof(pmu_num)); 1921 ret = readn(fd, &pmu_num, sizeof(pmu_num));
1913 if (ret != sizeof(pmu_num)) 1922 if (ret != sizeof(pmu_num))
1914 return -1; 1923 return -1;
1915 1924
@@ -1925,7 +1934,7 @@ static int process_pmu_mappings(struct perf_file_section *section __maybe_unused
1925 strbuf_init(&sb, 128); 1934 strbuf_init(&sb, 128);
1926 1935
1927 while (pmu_num) { 1936 while (pmu_num) {
1928 if (read(fd, &type, sizeof(type)) != sizeof(type)) 1937 if (readn(fd, &type, sizeof(type)) != sizeof(type))
1929 goto error; 1938 goto error;
1930 if (ph->needs_swap) 1939 if (ph->needs_swap)
1931 type = bswap_32(type); 1940 type = bswap_32(type);
@@ -2912,7 +2921,7 @@ int perf_event__process_tracing_data(union perf_event *event,
2912 session->repipe); 2921 session->repipe);
2913 padding = PERF_ALIGN(size_read, sizeof(u64)) - size_read; 2922 padding = PERF_ALIGN(size_read, sizeof(u64)) - size_read;
2914 2923
2915 if (read(session->fd, buf, padding) < 0) 2924 if (readn(session->fd, buf, padding) < 0)
2916 die("reading input file"); 2925 die("reading input file");
2917 if (session->repipe) { 2926 if (session->repipe) {
2918 int retw = write(STDOUT_FILENO, buf, padding); 2927 int retw = write(STDOUT_FILENO, buf, padding);