From 398d5459355620fc8ae40cebe27ca7bc2c1f7f44 Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Wed, 26 Nov 2014 13:00:03 -0500 Subject: [PATCH] Fix: OOM leaks in sessiond modprobe.c MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Mathieu Desnoyers Signed-off-by: Jérémie Galarneau --- src/bin/lttng-sessiond/modprobe.c | 60 +++++++++++++++++++++---------- 1 file changed, 41 insertions(+), 19 deletions(-) diff --git a/src/bin/lttng-sessiond/modprobe.c b/src/bin/lttng-sessiond/modprobe.c index b5b9d8cb7..a9035dab5 100644 --- a/src/bin/lttng-sessiond/modprobe.c +++ b/src/bin/lttng-sessiond/modprobe.c @@ -141,23 +141,31 @@ void modprobe_remove_lttng_control(void) LTTNG_MOD_REQUIRED); } +static void free_probes(void) +{ + int i; + + if (!probes) { + return; + } + for (i = 0; i < nr_probes; ++i) { + free(probes[i].name); + } + free(probes); + probes = NULL; + nr_probes = 0; +} + /* * Remove data kernel modules in reverse load order. */ void modprobe_remove_lttng_data(void) { - int i; - - if (probes) { - modprobe_remove_lttng(probes, nr_probes, LTTNG_MOD_OPTIONAL); - - for (i = 0; i < nr_probes; ++i) { - free(probes[i].name); - } - - free(probes); - probes = NULL; + if (!probes) { + return; } + modprobe_remove_lttng(probes, nr_probes, LTTNG_MOD_OPTIONAL); + free_probes(); } /* @@ -380,7 +388,7 @@ static int append_list_to_probes(const char *list) if (probes_capacity <= nr_probes) { ret = grow_probes(); if (ret) { - return ret; + goto error; } } @@ -391,13 +399,15 @@ static int append_list_to_probes(const char *list) cur_mod->name = zmalloc(name_len); if (!cur_mod->name) { PERROR("malloc probe list"); - return -ENOMEM; + ret = -ENOMEM; + goto error; } ret = snprintf(cur_mod->name, name_len, "lttng-probe-%s", next); if (ret < 0) { PERROR("snprintf modprobe name"); - return -ENOMEM; + ret = -ENOMEM; + goto error; } cur_mod++; @@ -405,8 +415,12 @@ static int append_list_to_probes(const char *list) } free(tmp_list); - return 0; + +error: + free(tmp_list); + free_probes(); + return ret; } /* @@ -430,7 +444,6 @@ int modprobe_lttng_data(void) if (list) { /* User-specified probes. */ ret = append_list_to_probes(list); - if (ret) { return ret; } @@ -451,7 +464,8 @@ int modprobe_lttng_data(void) if (!name) { PERROR("strdup probe item"); - return -ENOMEM; + ret = -ENOMEM; + goto error; } probes[i].name = name; @@ -470,12 +484,20 @@ int modprobe_lttng_data(void) if (list) { ret = append_list_to_probes(list); if (ret) { - return ret; + goto error; } } /* * Load probes modules now. */ - return modprobe_lttng(probes, nr_probes, LTTNG_MOD_OPTIONAL); + ret = modprobe_lttng(probes, nr_probes, LTTNG_MOD_OPTIONAL); + if (ret) { + goto error; + } + return ret; + +error: + free_probes(); + return ret; } -- 2.34.1