summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJiri Olsa <Jiri Olsa jolsa@redhat.com>2011-04-06 13:52:14 +0200
committerJiri Olsa <Jiri Olsa jolsa@redhat.com>2011-04-06 13:52:14 +0200
commit78a0f66ec27ba1750249a1590dbdbef69dd254a6 (patch)
treea69c7e2b0c3b224a04d8ad7a3d58cbeb3654fd79
parentfd67ed02ba43ebe54a037c04cfa94c7ab6b84205 (diff)
downloadlatrace-78a0f66ec27ba1750249a1590dbdbef69dd254a6.tar.gz
latrace-78a0f66ec27ba1750249a1590dbdbef69dd254a6.tar.xz
latrace-78a0f66ec27ba1750249a1590dbdbef69dd254a6.zip
fix memory leak in the argument display code
-rw-r--r--ChangeLog3
-rw-r--r--src/audit.c27
2 files changed, 17 insertions, 13 deletions
diff --git a/ChangeLog b/ChangeLog
index 3d0bf84..33517de 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,6 @@
+2011-04-06 Jiri Olsa <olsajiri@gmail.com>
+ * fix memory leak in the argument display code
+
2011-04-05 Jiri Olsa <olsajiri@gmail.com>
* fix controled config bug - missing shared config assignment
* moving conf header files to new location + rename s/conf/h/
diff --git a/src/audit.c b/src/audit.c
index 5f9071f..7f94fc5 100644
--- a/src/audit.c
+++ b/src/audit.c
@@ -70,6 +70,16 @@ static int check_flow_below(const char *symname, int in)
return ret;
}
+static void free_argbuf(int argret, char *argbuf, char *argdbuf)
+{
+ if (argret)
+ return;
+
+ free(argbuf);
+ if (lt_sh(&cfg, args_detailed) && (*argdbuf))
+ free(argdbuf);
+}
+
static int sym_entry(const char *symname, void *ptr,
char *lib_from, char *lib_to, La_regs *regs)
{
@@ -104,6 +114,7 @@ static int sym_entry(const char *symname, void *ptr,
len = lt_fifo_msym_get(&cfg, buf, FIFO_MSG_TYPE_ENTRY, &tv,
(char*) symname, lib_to, argbuf, argdbuf);
+ free_argbuf(argret, argbuf, argdbuf);
return lt_fifo_send(&cfg, pipe_fd, buf, len);
}
@@ -114,12 +125,7 @@ static int sym_entry(const char *symname, void *ptr,
symname, lib_to,
argbuf, argdbuf);
- if (!argret) {
- free(argbuf);
- if (lt_sh(&cfg, args_detailed) && (*argdbuf))
- free(argdbuf);
- }
-
+ free_argbuf(argret, argbuf, argdbuf);
return 0;
}
@@ -156,6 +162,7 @@ static int sym_exit(const char *symname, void *ptr,
len = lt_fifo_msym_get(&cfg, buf, FIFO_MSG_TYPE_EXIT, &tv,
(char*) symname, lib_to, argbuf, argdbuf);
+ free_argbuf(argret, argbuf, argdbuf);
return lt_fifo_send(&cfg, pipe_fd, buf, len);
}
@@ -166,13 +173,7 @@ static int sym_exit(const char *symname, void *ptr,
indent_depth--;
- if (!argret) {
- free(argbuf);
-
- if (lt_sh(&cfg, args_detailed) && (*argdbuf))
- free(argdbuf);
- }
-
+ free_argbuf(argret, argbuf, argdbuf);
return 0;
}