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) | |||
133 | /* Get raw string list of current kprobe_events or uprobe_events */ | 133 | /* Get raw string list of current kprobe_events or uprobe_events */ |
134 | struct strlist *probe_file__get_rawlist(int fd) | 134 | struct strlist *probe_file__get_rawlist(int fd) |
135 | { | 135 | { |
136 | int ret, idx; | 136 | int ret, idx, fddup; |
137 | FILE *fp; | 137 | FILE *fp; |
138 | char buf[MAX_CMDLEN]; | 138 | char buf[MAX_CMDLEN]; |
139 | char *p; | 139 | char *p; |
@@ -143,8 +143,17 @@ struct strlist *probe_file__get_rawlist(int fd) | |||
143 | return NULL; | 143 | return NULL; |
144 | 144 | ||
145 | sl = strlist__new(NULL, NULL); | 145 | sl = strlist__new(NULL, NULL); |
146 | if (sl == NULL) | ||
147 | return NULL; | ||
148 | |||
149 | fddup = dup(fd); | ||
150 | if (fddup < 0) | ||
151 | goto out_free_sl; | ||
152 | |||
153 | fp = fdopen(fddup, "r"); | ||
154 | if (!fp) | ||
155 | goto out_close_fddup; | ||
146 | 156 | ||
147 | fp = fdopen(dup(fd), "r"); | ||
148 | while (!feof(fp)) { | 157 | while (!feof(fp)) { |
149 | p = fgets(buf, MAX_CMDLEN, fp); | 158 | p = fgets(buf, MAX_CMDLEN, fp); |
150 | if (!p) | 159 | if (!p) |
@@ -156,13 +165,21 @@ struct strlist *probe_file__get_rawlist(int fd) | |||
156 | ret = strlist__add(sl, buf); | 165 | ret = strlist__add(sl, buf); |
157 | if (ret < 0) { | 166 | if (ret < 0) { |
158 | pr_debug("strlist__add failed (%d)\n", ret); | 167 | pr_debug("strlist__add failed (%d)\n", ret); |
159 | strlist__delete(sl); | 168 | goto out_close_fp; |
160 | return NULL; | ||
161 | } | 169 | } |
162 | } | 170 | } |
163 | fclose(fp); | 171 | fclose(fp); |
164 | 172 | ||
165 | return sl; | 173 | return sl; |
174 | |||
175 | out_close_fp: | ||
176 | fclose(fp); | ||
177 | goto out_free_sl; | ||
178 | out_close_fddup: | ||
179 | close(fddup); | ||
180 | out_free_sl: | ||
181 | strlist__delete(sl); | ||
182 | return NULL; | ||
166 | } | 183 | } |
167 | 184 | ||
168 | static struct strlist *__probe_file__get_namelist(int fd, bool include_group) | 185 | 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) | |||
447 | { | 464 | { |
448 | struct probe_cache_entry *entry = NULL; | 465 | struct probe_cache_entry *entry = NULL; |
449 | char buf[MAX_CMDLEN], *p; | 466 | char buf[MAX_CMDLEN], *p; |
450 | int ret = 0; | 467 | int ret = 0, fddup; |
451 | FILE *fp; | 468 | FILE *fp; |
452 | 469 | ||
453 | fp = fdopen(dup(pcache->fd), "r"); | 470 | fddup = dup(pcache->fd); |
454 | if (!fp) | 471 | if (fddup < 0) |
472 | return -errno; | ||
473 | fp = fdopen(fddup, "r"); | ||
474 | if (!fp) { | ||
475 | close(fddup); | ||
455 | return -EINVAL; | 476 | return -EINVAL; |
477 | } | ||
456 | 478 | ||
457 | while (!feof(fp)) { | 479 | while (!feof(fp)) { |
458 | if (!fgets(buf, MAX_CMDLEN, fp)) | 480 | if (!fgets(buf, MAX_CMDLEN, fp)) |