diff options
Diffstat (limited to 'tools/perf/util/header.c')
| -rw-r--r-- | tools/perf/util/header.c | 21 | 
1 files changed, 14 insertions, 7 deletions
diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c index d7e67b167ea..7cba0551a56 100644 --- a/tools/perf/util/header.c +++ b/tools/perf/util/header.c @@ -265,15 +265,16 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,  			  const char *name, bool is_kallsyms)  {  	const size_t size = PATH_MAX; -	char *filename = malloc(size), +	char *realname = realpath(name, NULL), +	     *filename = malloc(size),  	     *linkname = malloc(size), *targetname;  	int len, err = -1; -	if (filename == NULL || linkname == NULL) +	if (realname == NULL || filename == NULL || linkname == NULL)  		goto out_free;  	len = snprintf(filename, size, "%s%s%s", -		       debugdir, is_kallsyms ? "/" : "", name); +		       debugdir, is_kallsyms ? "/" : "", realname);  	if (mkdir_p(filename, 0755))  		goto out_free; @@ -283,7 +284,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,  		if (is_kallsyms) {  			 if (copyfile("/proc/kallsyms", filename))  				goto out_free; -		} else if (link(name, filename) && copyfile(name, filename)) +		} else if (link(realname, filename) && copyfile(name, filename))  			goto out_free;  	} @@ -300,6 +301,7 @@ int build_id_cache__add_s(const char *sbuild_id, const char *debugdir,  	if (symlink(targetname, linkname) == 0)  		err = 0;  out_free: +	free(realname);  	free(filename);  	free(linkname);  	return err; @@ -946,11 +948,16 @@ perf_header__find_attr(u64 id, struct perf_header *header)  	/*  	 * We set id to -1 if the data file doesn't contain sample -	 * ids. Check for this and avoid walking through the entire -	 * list of ids which may be large. +	 * ids. This can happen when the data file contains one type +	 * of event and in that case, the header can still store the +	 * event attribute information. Check for this and avoid +	 * walking through the entire list of ids which may be large.  	 */ -	if (id == -1ULL) +	if (id == -1ULL) { +		if (header->attrs > 0) +			return &header->attr[0]->attr;  		return NULL; +	}  	for (i = 0; i < header->attrs; i++) {  		struct perf_header_attr *attr = header->attr[i];  |