diff options
author | Namhyung Kim <namhyung.kim@lge.com> | 2012-12-17 01:38:54 -0500 |
---|---|---|
committer | Arnaldo Carvalho de Melo <acme@redhat.com> | 2013-01-24 14:40:11 -0500 |
commit | 5323f60c7578e9ddc92d1ca8a2d7b08284624cd1 (patch) | |
tree | 90e1f5e48c55dec263502ca5707ad6dbb80a7541 /tools | |
parent | 000ae33fdb5ff7bc7ae985b43e6278024a4985c2 (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.c | 63 |
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); |