X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fbin%2Flttng-sessiond%2Fmodprobe.c;h=32c4210130d9227b1d4cb320cb66f80ccb6b28d5;hp=ebf36646422314346c402c7373cdcccc4bc1f82b;hb=44603c80f2e1ce55b6237a02810de8e7fc1687d4;hpb=6c1c0768320135c6936c371b09731851b508c023 diff --git a/src/bin/lttng-sessiond/modprobe.c b/src/bin/lttng-sessiond/modprobe.c index ebf366464..32c421013 100644 --- a/src/bin/lttng-sessiond/modprobe.c +++ b/src/bin/lttng-sessiond/modprobe.c @@ -99,8 +99,8 @@ static struct kern_modules_param *probes; static int nr_probes; static int probes_capacity; -void modprobe_remove_lttng(const struct kern_modules_param *modules, - int entries, int required) +static void modprobe_remove_lttng(const struct kern_modules_param *modules, + int entries, int required) { int ret = 0, i; char modprobe[256]; @@ -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(); } /* @@ -352,10 +360,11 @@ static int append_list_to_probes(const char *list) { char *next; int index = nr_probes, ret; + char *tmp_list, *cur_list; assert(list); - char *tmp_list = strdup(list); + cur_list = tmp_list = strdup(list); if (!tmp_list) { PERROR("strdup temp list"); return -ENOMEM; @@ -365,11 +374,11 @@ static int append_list_to_probes(const char *list) size_t name_len; struct kern_modules_param *cur_mod; - next = strtok(tmp_list, ","); + next = strtok(cur_list, ","); if (!next) { break; } - tmp_list = NULL; + cur_list = NULL; /* filter leading spaces */ while (*next == ' ') { @@ -379,24 +388,26 @@ static int append_list_to_probes(const char *list) if (probes_capacity <= nr_probes) { ret = grow_probes(); if (ret) { - return ret; + goto error; } } /* Length 13 is "lttng-probe-" + \0 */ name_len = strlen(next) + 13; - cur_mod = &probes[index]; + cur_mod = &probes[index++]; 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++; @@ -404,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; } /* @@ -429,15 +444,14 @@ int modprobe_lttng_data(void) if (list) { /* User-specified probes. */ ret = append_list_to_probes(list); - if (ret) { return ret; } } else { /* Default probes. */ int def_len = ARRAY_SIZE(kern_modules_probes_default); - probes = zmalloc(sizeof(*probes) * def_len); + probes = zmalloc(sizeof(*probes) * def_len); if (!probes) { PERROR("malloc probe list"); return -ENOMEM; @@ -450,7 +464,8 @@ int modprobe_lttng_data(void) if (!name) { PERROR("strdup probe item"); - return -ENOMEM; + ret = -ENOMEM; + goto error; } probes[i].name = name; @@ -469,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; }