Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

perf tools: Fix mode setting in copyfile_mode_ns()

slow_copyfile() opens the file by name, so "write" permissions must not
be removed in copyfile_mode_ns() before calling slow_copyfile().

Example:

Before:

$ sudo chmod +r /proc/kcore
$ sudo setcap "cap_sys_admin,cap_sys_ptrace,cap_syslog,cap_sys_rawio=ep" tools/perf/perf
$ tools/perf/perf buildid-cache -k /proc/kcore
Couldn't add /proc/kcore

After:

$ sudo chmod +r /proc/kcore
$ sudo setcap "cap_sys_admin,cap_sys_ptrace,cap_syslog,cap_sys_rawio=ep" tools/perf/perf
$ tools/perf/perf buildid-cache -v -k /proc/kcore
kcore added to build-id cache directory /home/ahunter/.debug/[kernel.kcore]/37e340b1b5a7cf4f57ba8de2bc777359588a957f/2019100709562289

Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
Acked-by: Jiri Olsa <jolsa@kernel.org>
Tested-by: Arnaldo Carvalho de Melo <acme@redhat.com>
Link: http://lore.kernel.org/lkml/20191007070221.11158-1-adrian.hunter@intel.com
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>

authored by

Adrian Hunter and committed by
Arnaldo Carvalho de Melo
5a0baf51 f948eb45

+5 -3
+5 -3
tools/perf/util/copyfile.c
··· 101 101 if (tofd < 0) 102 102 goto out; 103 103 104 - if (fchmod(tofd, mode)) 105 - goto out_close_to; 106 - 107 104 if (st.st_size == 0) { /* /proc? do it slowly... */ 108 105 err = slow_copyfile(from, tmp, nsi); 106 + if (!err && fchmod(tofd, mode)) 107 + err = -1; 109 108 goto out_close_to; 110 109 } 110 + 111 + if (fchmod(tofd, mode)) 112 + goto out_close_to; 111 113 112 114 nsinfo__mountns_enter(nsi, &nsc); 113 115 fromfd = open(from, O_RDONLY);