diff --git a/libpfm-truncation.patch b/libpfm-truncation.patch new file mode 100644 index 0000000..99170f3 --- /dev/null +++ b/libpfm-truncation.patch @@ -0,0 +1,85 @@ +diff --git a/lib/pfmlib_perf_event_pmu.c b/lib/pfmlib_perf_event_pmu.c +index 86ff824..ca371d8 100644 +--- a/lib/pfmlib_perf_event_pmu.c ++++ b/lib/pfmlib_perf_event_pmu.c +@@ -344,6 +344,7 @@ gen_tracepoint_table(void) + + err = 0; + while((d1 = readdir(dir1)) && err >= 0) { ++ int retlen; + + if (!strcmp(d1->d_name, ".")) + continue; +@@ -351,7 +352,10 @@ gen_tracepoint_table(void) + if (!strcmp(d1->d_name, "..")) + continue; + +- snprintf(d2path, MAXPATHLEN, "%s/%s", debugfs_mnt, d1->d_name); ++ retlen = snprintf(d2path, MAXPATHLEN, "%s/%s", debugfs_mnt, d1->d_name); ++ /* if string truncated do not try to open the corrupted path */ ++ if (retlen < 0 || retlen >= MAXPATHLEN) ++ continue; + + /* fails if d2path is not a directory */ + dir2 = opendir(d2path); +@@ -398,10 +402,16 @@ gen_tracepoint_table(void) + continue; + + #ifdef HAS_OPENAT +- snprintf(idpath, MAXPATHLEN, "%s/id", d2->d_name); ++ retlen = snprintf(idpath, MAXPATHLEN, "%s/id", d2->d_name); ++ /* if string truncated do not try to open the corrupted path */ ++ if (retlen < 0 || retlen >= MAXPATHLEN) ++ continue; + fd = openat(dir2_fd, idpath, O_RDONLY); + #else +- snprintf(idpath, MAXPATHLEN, "%s/%s/id", d2path, d2->d_name); ++ retlen = snprintf(idpath, MAXPATHLEN, "%s/%s/id", d2path, d2->d_name); ++ /* if string truncated do not try to open the corrupted path */ ++ if (retlen < 0 || retlen >= MAXPATHLEN) ++ continue; + fd = open(idpath, O_RDONLY); + #endif + if (fd == -1) +diff --git a/perf_examples/syst_count.c b/perf_examples/syst_count.c +index e0fa42e..7841d01 100644 +--- a/perf_examples/syst_count.c ++++ b/perf_examples/syst_count.c +@@ -112,12 +112,14 @@ open_cgroup(char *name) + { + char path[MAX_PATH+1]; + char mnt[MAX_PATH+1]; +- int cfd; ++ int cfd, retlen; + + if (cgroupfs_find_mountpoint(mnt, MAX_PATH+1)) + errx(1, "cannot find cgroup fs mount point"); + +- snprintf(path, MAX_PATH, "%s/%s", mnt, name); ++ retlen = snprintf(path, MAX_PATH, "%s/%s", mnt, name); ++ if (retlen < 0 || retlen >= MAX_PATH) ++ warn("path truncated %s/%s\n", mnt, name); + + cfd = open(path, O_RDONLY); + if (cfd == -1) +diff --git a/perf_examples/syst_smpl.c b/perf_examples/syst_smpl.c +index 6b70e0e..a8b00df 100755 +--- a/perf_examples/syst_smpl.c ++++ b/perf_examples/syst_smpl.c +@@ -278,12 +278,14 @@ open_cgroup(char *name) + { + char path[MAX_PATH+1]; + char mnt[MAX_PATH+1]; +- int cfd; ++ int cfd, retlen; + + if (cgroupfs_find_mountpoint(mnt, MAX_PATH+1)) + errx(1, "cannot find cgroup fs mount point"); + +- snprintf(path, MAX_PATH, "%s/%s", mnt, name); ++ retlen = snprintf(path, MAX_PATH, "%s/%s", mnt, name); ++ if (retlen < 0 || retlen >= MAX_PATH) ++ warn("path truncated %s/%s\n", mnt, name); + + cfd = open(path, O_RDONLY); + if (cfd == -1) diff --git a/libpfm.spec b/libpfm.spec index eb0ed58..0424a04 100644 --- a/libpfm.spec +++ b/libpfm.spec @@ -10,7 +10,7 @@ Name: libpfm Version: 4.9.0 -Release: 3%{?dist} +Release: 4%{?dist} Summary: Library to encode performance events for use by perf tool @@ -18,6 +18,7 @@ Group: System Environment/Libraries License: MIT URL: http://perfmon2.sourceforge.net/ Source0: http://sourceforge.net/projects/perfmon2/files/libpfm4/%{name}-%{version}.tar.gz +Patch1: libpfm-truncation.patch %if %{with python} BuildRequires: python2-devel @@ -66,6 +67,7 @@ Python bindings for libpfm4 and perf_event_open system call. %prep %setup -q +%patch1 -p1 -b .trun %build %if %{with python} @@ -114,6 +116,9 @@ make \ %endif %changelog +* Tue Jan 30 2018 William Cohen - 4.9.0-4 +- Address truncation issues. + * Tue Jan 30 2018 William Cohen - 4.9.0-3 - Use the RPM build flags. (RHBZ #1540262)