Fix: OOM leaks in sessiond modprobe.c
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 26 Nov 2014 18:00:03 +0000 (13:00 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Wed, 26 Nov 2014 21:18:18 +0000 (16:18 -0500)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
src/bin/lttng-sessiond/modprobe.c

index b5b9d8cb793c2d6bbffc156d0ea8f6d314a4b0c7..a9035dab5766d167d1f0646befb4569f0de05974 100644 (file)
@@ -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;
 }
This page took 0.028067 seconds and 4 git commands to generate.