]> git.karo-electronics.de Git - karo-tx-linux.git/commitdiff
perf tools: Do not fail in case of empty HOME env variable
authorJiri Olsa <jolsa@redhat.com>
Thu, 30 Mar 2017 14:46:37 +0000 (16:46 +0200)
committerArnaldo Carvalho de Melo <acme@redhat.com>
Fri, 31 Mar 2017 14:26:04 +0000 (11:26 -0300)
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>
tools/perf/util/config.c

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