diff options
Diffstat (limited to 'tools/perf/util/config.c')
| -rw-r--r-- | tools/perf/util/config.c | 53 | 
1 files changed, 37 insertions, 16 deletions
diff --git a/tools/perf/util/config.c b/tools/perf/util/config.c index e02d78cae70..24519e14ac5 100644 --- a/tools/perf/util/config.c +++ b/tools/perf/util/config.c @@ -1,5 +1,8 @@  /* - * GIT - The information manager from hell + * config.c + * + * Helper functions for parsing config items. + * Originally copied from GIT source.   *   * Copyright (C) Linus Torvalds, 2005   * Copyright (C) Johannes Schindelin, 2005 @@ -8,6 +11,7 @@  #include "util.h"  #include "cache.h"  #include "exec_cmd.h" +#include "util/hist.h"  /* perf_hist_config */  #define MAXNAME (256) @@ -117,7 +121,7 @@ static char *parse_value(void)  static inline int iskeychar(int c)  { -	return isalnum(c) || c == '-'; +	return isalnum(c) || c == '-' || c == '_';  }  static int get_value(config_fn_t fn, void *data, char *name, unsigned int len) @@ -339,18 +343,23 @@ const char *perf_config_dirname(const char *name, const char *value)  	return value;  } -static int perf_default_core_config(const char *var __used, const char *value __used) +static int perf_default_core_config(const char *var __maybe_unused, +				    const char *value __maybe_unused)  { -	/* Add other config variables here and to Documentation/config.txt. */ +	/* Add other config variables here. */  	return 0;  } -int perf_default_config(const char *var, const char *value, void *dummy __used) +int perf_default_config(const char *var, const char *value, +			void *dummy __maybe_unused)  {  	if (!prefixcmp(var, "core."))  		return perf_default_core_config(var, value); -	/* Add other config variables here and to Documentation/config.txt. */ +	if (!prefixcmp(var, "hist.")) +		return perf_hist_config(var, value); + +	/* Add other config variables here. */  	return 0;  } @@ -399,7 +408,6 @@ static int perf_config_global(void)  int perf_config(config_fn_t fn, void *data)  {  	int ret = 0, found = 0; -	char *repo_config = NULL;  	const char *home = NULL;  	/* Setting $PERF_CONFIG makes perf read _only_ the given config file. */ @@ -414,19 +422,32 @@ int perf_config(config_fn_t fn, void *data)  	home = getenv("HOME");  	if (perf_config_global() && home) {  		char *user_config = strdup(mkpath("%s/.perfconfig", home)); -		if (!access(user_config, R_OK)) { -			ret += perf_config_from_file(fn, user_config, data); -			found += 1; +		struct stat st; + +		if (user_config == NULL) { +			warning("Not enough memory to process %s/.perfconfig, " +				"ignoring it.", home); +			goto out;  		} -		free(user_config); -	} -	repo_config = perf_pathdup("config"); -	if (!access(repo_config, R_OK)) { -		ret += perf_config_from_file(fn, repo_config, data); +		if (stat(user_config, &st) < 0) +			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) +			goto out_free; + +		ret += perf_config_from_file(fn, user_config, data);  		found += 1; +out_free: +		free(user_config);  	} -	free(repo_config); +out:  	if (found == 0)  		return -1;  	return ret;  | 
