Commit 11870d71 authored by Masami Hiramatsu's avatar Masami Hiramatsu Committed by Arnaldo Carvalho de Melo

perf symbols: Introduce filename__readable to check readability

Introduce filename__readable to check readability by opening the file
directly. Since the access(R_OK) just checks the readability based on
real UID/GID, it is ignored that the effective UID/GID and capabilities
for some special file (e.g.  /proc/kcore).

filename__readable() directly opens given file with O_RDONLY so that the
kernel checks it by effective UID/GID and capabilities.
Signed-off-by: default avatarMasami Hiramatsu <mhiramat@kernel.org>
Acked-by: default avatarNamhyung Kim <namhyung@kernel.org>
Cc: Ananth N Mavinakayanahalli <ananth@linux.vnet.ibm.com>
Cc: Brendan Gregg <brendan.d.gregg@gmail.com>
Cc: Hemant Kumar <hemant@linux.vnet.ibm.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Link: http://lkml.kernel.org/r/20160528151513.16098.97576.stgit@devboxSigned-off-by: default avatarArnaldo Carvalho de Melo <acme@redhat.com>
parent dcd1e2a7
...@@ -1641,6 +1641,20 @@ static int find_matching_kcore(struct map *map, char *dir, size_t dir_sz) ...@@ -1641,6 +1641,20 @@ static int find_matching_kcore(struct map *map, char *dir, size_t dir_sz)
return ret; return ret;
} }
/*
* Use open(O_RDONLY) to check readability directly instead of access(R_OK)
* since access(R_OK) only checks with real UID/GID but open() use effective
* UID/GID and actual capabilities (e.g. /proc/kcore requires CAP_SYS_RAWIO).
*/
static bool filename__readable(const char *file)
{
int fd = open(file, O_RDONLY);
if (fd < 0)
return false;
close(fd);
return true;
}
static char *dso__find_kallsyms(struct dso *dso, struct map *map) static char *dso__find_kallsyms(struct dso *dso, struct map *map)
{ {
u8 host_build_id[BUILD_ID_SIZE]; u8 host_build_id[BUILD_ID_SIZE];
...@@ -1668,7 +1682,6 @@ static char *dso__find_kallsyms(struct dso *dso, struct map *map) ...@@ -1668,7 +1682,6 @@ static char *dso__find_kallsyms(struct dso *dso, struct map *map)
/* Use /proc/kallsyms if possible */ /* Use /proc/kallsyms if possible */
if (is_host) { if (is_host) {
DIR *d; DIR *d;
int fd;
/* If no cached kcore go with /proc/kallsyms */ /* If no cached kcore go with /proc/kallsyms */
d = opendir(path); d = opendir(path);
...@@ -1677,16 +1690,15 @@ static char *dso__find_kallsyms(struct dso *dso, struct map *map) ...@@ -1677,16 +1690,15 @@ static char *dso__find_kallsyms(struct dso *dso, struct map *map)
closedir(d); closedir(d);
/* /*
* Do not check the build-id cache, until we know we cannot use * Do not check the build-id cache, unless we know we cannot use
* /proc/kcore. * /proc/kcore or module maps don't match to /proc/kallsyms.
* To check readability of /proc/kcore, do not use access(R_OK)
* since /proc/kcore requires CAP_SYS_RAWIO to read and access
* can't check it.
*/ */
fd = open("/proc/kcore", O_RDONLY); if (filename__readable("/proc/kcore") &&
if (fd != -1) { !validate_kcore_addresses("/proc/kallsyms", map))
close(fd); goto proc_kallsyms;
/* If module maps match go with /proc/kallsyms */
if (!validate_kcore_addresses("/proc/kallsyms", map))
goto proc_kallsyms;
}
/* Find kallsyms in build-id cache with kcore */ /* Find kallsyms in build-id cache with kcore */
if (!find_matching_kcore(map, path, sizeof(path))) if (!find_matching_kcore(map, path, sizeof(path)))
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment