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 perf_tool	tool; | ||||
| 	struct perf_session	*session; | ||||
| 	bool			force, use_tui, use_gtk, use_stdio; | ||||
| 	bool			use_tui, use_gtk, use_stdio; | ||||
| 	bool			hide_unresolved; | ||||
| 	bool			dont_use_callchains; | ||||
| 	bool			show_full_info; | ||||
| @ -678,7 +678,7 @@ int cmd_report(int argc, const char **argv, const char *prefix __maybe_unused) | ||||
| 		   "file", "vmlinux pathname"), | ||||
| 	OPT_STRING(0, "kallsyms", &symbol_conf.kallsyms_name, | ||||
| 		   "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, | ||||
| 		    "load module symbols - WARNING: use only with -k and LIVE kernel"), | ||||
| 	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.force = report.force; | ||||
| 	file.force = symbol_conf.force; | ||||
| 
 | ||||
| repeat: | ||||
| 	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) | ||||
| 			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, " | ||||
| 				"ignoring it.\n", dso->name); | ||||
| 				   "ignoring it (use -f to override).\n", dso->name); | ||||
| 			goto out; | ||||
| 		} | ||||
| 
 | ||||
|  | ||||
| @ -84,6 +84,7 @@ struct symbol_conf { | ||||
| 	unsigned short	priv_size; | ||||
| 	unsigned short	nr_events; | ||||
| 	bool		try_vmlinux_path, | ||||
| 			force, | ||||
| 			ignore_vmlinux, | ||||
| 			ignore_vmlinux_buildid, | ||||
| 			show_kernel_path, | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user