perf symbols: Allow forcing reading of non-root owned files by root
When the root user tries to read a file owned by some other user we get: # ls -la perf.data -rw-------. 1 acme acme 20032 Nov 12 15:50 perf.data # perf report File perf.data not owned by current user or root (use -f to override) # perf report -f | grep -v ^# | head -2 30.96% ls [kernel.vmlinux] [k] do_set_pte 28.24% ls libc-2.20.so [.] intel_check_word # That wasn't happening when the symbol code tried to read a JIT map, where the same check was done but no forcing was possible, fix it. Reported-by: Brendan Gregg <brendan.d.gregg@gmail.com> Tested-by: Brendan Gregg <brendan.d.gregg@gmail.com> Cc: Adrian Hunter <adrian.hunter@intel.com> Cc: David Ahern <dsahern@gmail.com> Cc: Jiri Olsa <jolsa@redhat.com> Cc: Namhyung Kim <namhyung@kernel.org> Cc: Wang Nan <wangnan0@huawei.com> Link: http://permalink.gmane.org/gmane.linux.kernel.perf.user/2380 Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
parent
b7f294b58a
commit
2059fc7a5a
|
@ -44,7 +44,7 @@
|
||||||
struct report {
|
struct report {
|
||||||
struct perf_tool tool;
|
struct perf_tool tool;
|
||||||
struct perf_session *session;
|
struct perf_session *session;
|
||||||
bool force, use_tui, use_gtk, use_stdio;
|
bool use_tui, use_gtk, use_stdio;
|
||||||
bool hide_unresolved;
|
bool hide_unresolved;
|
||||||
bool dont_use_callchains;
|
bool dont_use_callchains;
|
||||||
bool show_full_info;
|
bool show_full_info;
|
||||||
|
@ -678,7 +678,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||||
"file", "vmlinux pathname"),
|
"file", "vmlinux pathname"),
|
||||||
OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name,
|
OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name,
|
||||||
"file", "kallsyms pathname"),
|
"file", "kallsyms pathname"),
|
||||||
OPT_BOOLEAN('f', "force", &report.force, "don't complain, do it"),
|
OPT_BOOLEAN('f', "force", &symbol_conf.force, "don't complain, do it"),
|
||||||
OPT_BOOLEAN('m', "modules", &symbol_conf.use_modules,
|
OPT_BOOLEAN('m', "modules", &symbol_conf.use_modules,
|
||||||
"load module symbols - WARNING: use only with -k and LIVE kernel"),
|
"load module symbols - WARNING: use only with -k and LIVE kernel"),
|
||||||
OPT_BOOLEAN('n', "show-nr-samples", &symbol_conf.show_nr_samples,
|
OPT_BOOLEAN('n', "show-nr-samples", &symbol_conf.show_nr_samples,
|
||||||
|
@ -832,7 +832,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused)
|
||||||
}
|
}
|
||||||
|
|
||||||
file.path = input_name;
|
file.path = input_name;
|
||||||
file.force = report.force;
|
file.force = symbol_conf.force;
|
||||||
|
|
||||||
repeat:
|
repeat:
|
||||||
session = perf_session__new(&file, false, &report.tool);
|
session = perf_session__new(&file, false, &report.tool);
|
||||||
|
|
|
@ -1436,9 +1436,9 @@ int dso__load(struct dso *dso, struct map *map, symbol_filter_t filter)
|
||||||
if (lstat(dso->name, &st) < 0)
|
if (lstat(dso->name, &st) < 0)
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
if (st.st_uid && (st.st_uid != geteuid())) {
|
if (!symbol_conf.force && st.st_uid && (st.st_uid != geteuid())) {
|
||||||
pr_warning("File %s not owned by current user or root, "
|
pr_warning("File %s not owned by current user or root, "
|
||||||
"ignoring it.\n", dso->name);
|
"ignoring it (use -f to override).\n", dso->name);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -84,6 +84,7 @@ struct symbol_conf {
|
||||||
unsigned short priv_size;
|
unsigned short priv_size;
|
||||||
unsigned short nr_events;
|
unsigned short nr_events;
|
||||||
bool try_vmlinux_path,
|
bool try_vmlinux_path,
|
||||||
|
force,
|
||||||
ignore_vmlinux,
|
ignore_vmlinux,
|
||||||
ignore_vmlinux_buildid,
|
ignore_vmlinux_buildid,
|
||||||
show_kernel_path,
|
show_kernel_path,
|
||||||
|
|
Loading…
Reference in New Issue