perf tools: Do not fail in case of empty HOME env variable
Jiri Olsa
reviewerPATCH 1/1 perf tools: Do not fail in case of empty HOME env variable
From: Jiri Olsa <[email protected]>
Currently we fail in following case:
$ unset HOME $ ./perf record ls $ echo $? 255
It's because of the config code init fails due to missing HOME variable value. Fixing this by skipping the user config init if there's no HOME variable value.
Reported-by Jan Stancek <[email protected]>
Signed-off-by Jiri Olsa <[email protected]>
--- tools/perf/util/config.c | 54 +++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 23 deletions(-)
tools/perf/util/config.c +31 -23
@@ -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; }
Signature · 1 line
2.9.3
Em Thu, Mar 30, 2017 at 04:46:37PM +0200, Jiri Olsa escreveu:
Quoted 7 lines
From: Jiri Olsa <[email protected]>
Currently we fail in following case:
$ unset HOME $ ./perf record ls $ echo $? 255
Thanks, applied.
- Arnaldo
tip-bot for Jiri Olsa
merge botperf tools: Do not fail in case of empty HOME env variable
Commit-ID: 3e00cbe8891a655520ca2cfe9b6d509d0a845f07 Gitweb: http://git.kernel.org/tip/3e00cbe8891a655520ca2cfe9b6d509d0a845f07 Author: Jiri Olsa <[email protected]> AuthorDate: Thu, 30 Mar 2017 16:46:37 +0200 Committer: Arnaldo Carvalho de Melo <[email protected]> CommitDate: Fri, 31 Mar 2017 11:26:04 -0300
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 <[email protected]>
Signed-off-by Jiri Olsa <[email protected]>
Cc David Ahern <[email protected]>
Cc Namhyung Kim <[email protected]>
Cc Peter Zijlstra <[email protected]>
Signed-off-by Arnaldo Carvalho de Melo <[email protected]>
--- tools/perf/util/config.c | 54 +++++++++++++++++++++++++++--------------------- 1 file changed, 31 insertions(+), 23 deletions(-)
tools/perf/util/config.c +31 -23
@@ -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; }