perf probe: Fix some error exit paths

That could leave filedescriptors open and leak memory. Also stop using
xmalloc, use malloc and handle results just like other error cases in
the same routine that used it.

Cc: Frédéric Weisbecker <fweisbec@gmail.com>
Cc: Masami Hiramatsu <mhiramat@redhat.com>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Tom Zanussi <tzanussi@gmail.com>
LKML-Reference: <new-submission>
Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
This commit is contained in:
Arnaldo Carvalho de Melo 2010-05-18 23:04:28 -03:00
parent a41794cdd7
commit b448c4b613
1 changed files with 19 additions and 10 deletions

View File

@ -743,32 +743,36 @@ static int find_lazy_match_lines(struct list_head *head,
const char *fname, const char *pat)
{
char *fbuf, *p1, *p2;
int fd, ret, line, nlines = 0;
int fd, line, nlines = -1;
struct stat st;
fd = open(fname, O_RDONLY);
if (fd < 0) {
pr_warning("Failed to open %s: %s\n", fname, strerror(-fd));
return fd;
return -errno;
}
ret = fstat(fd, &st);
if (ret < 0) {
if (fstat(fd, &st) < 0) {
pr_warning("Failed to get the size of %s: %s\n",
fname, strerror(errno));
return ret;
nlines = -errno;
goto out_close;
}
fbuf = xmalloc(st.st_size + 2);
ret = read(fd, fbuf, st.st_size);
if (ret < 0) {
nlines = -ENOMEM;
fbuf = malloc(st.st_size + 2);
if (fbuf == NULL)
goto out_close;
if (read(fd, fbuf, st.st_size) < 0) {
pr_warning("Failed to read %s: %s\n", fname, strerror(errno));
return ret;
nlines = -errno;
goto out_free_fbuf;
}
close(fd);
fbuf[st.st_size] = '\n'; /* Dummy line */
fbuf[st.st_size + 1] = '\0';
p1 = fbuf;
line = 1;
nlines = 0;
while ((p2 = strchr(p1, '\n')) != NULL) {
*p2 = '\0';
if (strlazymatch(p1, pat)) {
@ -778,7 +782,10 @@ static int find_lazy_match_lines(struct list_head *head,
line++;
p1 = p2 + 1;
}
out_free_fbuf:
free(fbuf);
out_close:
close(fd);
return nlines;
}
@ -955,6 +962,8 @@ int find_kprobe_trace_events(int fd, struct perf_probe_event *pev,
if (!dbg) {
pr_warning("No dwarf info found in the vmlinux - "
"please rebuild with CONFIG_DEBUG_INFO=y.\n");
free(pf.tevs);
*tevs = NULL;
return -EBADF;
}