projects
/
lttng-tools.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix: Possible memory leak when multiple config files are loaded
[lttng-tools.git]
/
src
/
bin
/
lttng-sessiond
/
main.c
diff --git
a/src/bin/lttng-sessiond/main.c
b/src/bin/lttng-sessiond/main.c
index 1d218b170ec31112f750d5ffae02ff3d41080870..cef1040563b1f84ae2af85235c80752aa4cabfe9 100644
(file)
--- a/
src/bin/lttng-sessiond/main.c
+++ b/
src/bin/lttng-sessiond/main.c
@@
-4198,7
+4198,20
@@
static int set_option(int opt, const char *arg, const char *optname)
opt_background = 1;
break;
case 'g':
opt_background = 1;
break;
case 'g':
+ /*
+ * If the override option is set, the pointer points to a
+ * *non* const thus freeing it even though the variable type is
+ * set to const.
+ */
+ if (tracing_group_name_override) {
+ free((void *) tracing_group_name);
+ }
tracing_group_name = strdup(arg);
tracing_group_name = strdup(arg);
+ if (!tracing_group_name) {
+ perror("strdup");
+ ret = -ENOMEM;
+ }
+ tracing_group_name_override = 1;
break;
case 'h':
usage();
break;
case 'h':
usage();
@@
-4236,10
+4249,15
@@
static int set_option(int opt, const char *arg, const char *optname)
case 'v':
/* Verbose level can increase using multiple -v */
if (arg) {
case 'v':
/* Verbose level can increase using multiple -v */
if (arg) {
+ /* Value obtained from config file */
lttng_opt_verbose = config_parse_value(arg);
} else {
lttng_opt_verbose = config_parse_value(arg);
} else {
- lttng_opt_verbose += 1;
+ /* -v used on command line */
+ lttng_opt_verbose++;
}
}
+ /* Clamp value to [0, 3] */
+ lttng_opt_verbose = lttng_opt_verbose < 0 ? 0 :
+ (lttng_opt_verbose <= 3 ? lttng_opt_verbose : 3);
break;
case 'Z':
if (arg) {
break;
case 'Z':
if (arg) {
@@
-4249,23
+4267,56
@@
static int set_option(int opt, const char *arg, const char *optname)
}
break;
case 'u':
}
break;
case 'u':
+ if (consumerd32_bin_override) {
+ free((void *) consumerd32_bin);
+ }
consumerd32_bin = strdup(arg);
consumerd32_bin = strdup(arg);
+ if (!consumerd32_bin) {
+ perror("strdup");
+ ret = -ENOMEM;
+ }
consumerd32_bin_override = 1;
break;
case 'U':
consumerd32_bin_override = 1;
break;
case 'U':
+ if (consumerd32_libdir_override) {
+ free((void *) consumerd32_libdir);
+ }
consumerd32_libdir = strdup(arg);
consumerd32_libdir = strdup(arg);
+ if (!consumerd32_libdir) {
+ perror("strdup");
+ ret = -ENOMEM;
+ }
consumerd32_libdir_override = 1;
break;
case 't':
consumerd32_libdir_override = 1;
break;
case 't':
+ if (consumerd64_bin_override) {
+ free((void *) consumerd64_bin);
+ }
consumerd64_bin = strdup(arg);
consumerd64_bin = strdup(arg);
+ if (!consumerd64_bin) {
+ perror("strdup");
+ ret = -ENOMEM;
+ }
consumerd64_bin_override = 1;
break;
case 'T':
consumerd64_bin_override = 1;
break;
case 'T':
+ if (consumerd64_libdir_override) {
+ free((void *) consumerd64_libdir);
+ }
consumerd64_libdir = strdup(arg);
consumerd64_libdir = strdup(arg);
+ if (!consumerd64_libdir) {
+ perror("strdup");
+ ret = -ENOMEM;
+ }
consumerd64_libdir_override = 1;
break;
case 'p':
consumerd64_libdir_override = 1;
break;
case 'p':
+ free(opt_pidfile);
opt_pidfile = strdup(arg);
opt_pidfile = strdup(arg);
+ if (!opt_pidfile) {
+ perror("strdup");
+ ret = -ENOMEM;
+ }
break;
case 'J': /* JUL TCP port. */
{
break;
case 'J': /* JUL TCP port. */
{
@@
-4286,6
+4337,7
@@
static int set_option(int opt, const char *arg, const char *optname)
break;
}
case 'l':
break;
}
case 'l':
+ free(opt_load_session_path);
opt_load_session_path = strdup(arg);
if (!opt_load_session_path) {
perror("strdup");
opt_load_session_path = strdup(arg);
if (!opt_load_session_path) {
perror("strdup");
@@
-4293,7
+4345,12
@@
static int set_option(int opt, const char *arg, const char *optname)
}
break;
case 'P': /* probe modules list */
}
break;
case 'P': /* probe modules list */
+ free(kmod_probes_list);
kmod_probes_list = strdup(arg);
kmod_probes_list = strdup(arg);
+ if (!kmod_probes_list) {
+ perror("strdup");
+ ret = -ENOMEM;
+ }
break;
case 'f':
/* This is handled in set_options() thus silent break. */
break;
case 'f':
/* This is handled in set_options() thus silent break. */
This page took
0.025111 seconds
and
4
git commands to generate.