perf tools: Do not fail in case of empty HOME env variable

Currently we fail in the following case:

  $ unset HOME
  $ ./perf record ls
  $ echo $?
  255

It's because the config code init fails due to a missing HOME variable
value. Fix this by skipping the user config init if there's no HOME
variable value.

Reported-by: Jan Stancek <jstancek@redhat.com>
Signed-off-by: Jiri Olsa <jolsa@kernel.org>
Cc: David Ahern <dsahern@gmail.com>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Link: http://lkml.kernel.org/r/20170330144637.7468-1-jolsa@kernel.org
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Jiri Olsa 2017-03-30 16:46:37 +02:00 committed by Arnaldo Carvalho de Melo
parent 67ef28794d
commit 3e00cbe889

View File

@ -627,6 +627,8 @@ static int perf_config_set__init(struct perf_config_set *set)
{ {
int ret = -1; int ret = -1;
const char *home = NULL; const char *home = NULL;
char *user_config;
struct stat st;
/* Setting $PERF_CONFIG makes perf read _only_ the given config file. */ /* Setting $PERF_CONFIG makes perf read _only_ the given config file. */
if (config_exclusive_filename) if (config_exclusive_filename)
@ -637,35 +639,41 @@ static int perf_config_set__init(struct perf_config_set *set)
} }
home = getenv("HOME"); home = getenv("HOME");
if (perf_config_global() && home) {
char *user_config = strdup(mkpath("%s/.perfconfig", home));
struct stat st;
if (user_config == NULL) { /*
warning("Not enough memory to process %s/.perfconfig, " * Skip reading user config if:
"ignoring it.", home); * - there is no place to read it from (HOME)
goto out; * - we are asked not to (PERF_CONFIG_NOGLOBAL=1)
} */
if (!home || !*home || !perf_config_global())
return 0;
if (stat(user_config, &st) < 0) { user_config = strdup(mkpath("%s/.perfconfig", home));
if (errno == ENOENT) if (user_config == NULL) {
ret = 0; warning("Not enough memory to process %s/.perfconfig, "
goto out_free; "ignoring it.", home);
} goto out;
ret = 0;
if (st.st_uid && (st.st_uid != geteuid())) {
warning("File %s not owned by current user or root, "
"ignoring it.", user_config);
goto out_free;
}
if (st.st_size)
ret = perf_config_from_file(collect_config, user_config, set);
out_free:
free(user_config);
} }
if (stat(user_config, &st) < 0) {
if (errno == ENOENT)
ret = 0;
goto out_free;
}
ret = 0;
if (st.st_uid && (st.st_uid != geteuid())) {
warning("File %s not owned by current user or root, "
"ignoring it.", user_config);
goto out_free;
}
if (st.st_size)
ret = perf_config_from_file(collect_config, user_config, set);
out_free:
free(user_config);
out: out:
return ret; return ret;
} }