diff options
Diffstat (limited to 'tools/perf/util/probe-file.c')
| -rw-r--r-- | tools/perf/util/probe-file.c | 36 | 
1 files changed, 29 insertions, 7 deletions
diff --git a/tools/perf/util/probe-file.c b/tools/perf/util/probe-file.c index 9aed9c332da6..9c3b9ed5b3c3 100644 --- a/tools/perf/util/probe-file.c +++ b/tools/perf/util/probe-file.c @@ -133,7 +133,7 @@ int probe_file__open_both(int *kfd, int *ufd, int flag)  /* Get raw string list of current kprobe_events  or uprobe_events */  struct strlist *probe_file__get_rawlist(int fd)  { -	int ret, idx; +	int ret, idx, fddup;  	FILE *fp;  	char buf[MAX_CMDLEN];  	char *p; @@ -143,8 +143,17 @@ struct strlist *probe_file__get_rawlist(int fd)  		return NULL;  	sl = strlist__new(NULL, NULL); +	if (sl == NULL) +		return NULL; + +	fddup = dup(fd); +	if (fddup < 0) +		goto out_free_sl; + +	fp = fdopen(fddup, "r"); +	if (!fp) +		goto out_close_fddup; -	fp = fdopen(dup(fd), "r");  	while (!feof(fp)) {  		p = fgets(buf, MAX_CMDLEN, fp);  		if (!p) @@ -156,13 +165,21 @@ struct strlist *probe_file__get_rawlist(int fd)  		ret = strlist__add(sl, buf);  		if (ret < 0) {  			pr_debug("strlist__add failed (%d)\n", ret); -			strlist__delete(sl); -			return NULL; +			goto out_close_fp;  		}  	}  	fclose(fp);  	return sl; + +out_close_fp: +	fclose(fp); +	goto out_free_sl; +out_close_fddup: +	close(fddup); +out_free_sl: +	strlist__delete(sl); +	return NULL;  }  static struct strlist *__probe_file__get_namelist(int fd, bool include_group) @@ -447,12 +464,17 @@ static int probe_cache__load(struct probe_cache *pcache)  {  	struct probe_cache_entry *entry = NULL;  	char buf[MAX_CMDLEN], *p; -	int ret = 0; +	int ret = 0, fddup;  	FILE *fp; -	fp = fdopen(dup(pcache->fd), "r"); -	if (!fp) +	fddup = dup(pcache->fd); +	if (fddup < 0) +		return -errno; +	fp = fdopen(fddup, "r"); +	if (!fp) { +		close(fddup);  		return -EINVAL; +	}  	while (!feof(fp)) {  		if (!fgets(buf, MAX_CMDLEN, fp))  | 
