From e9efbcd3dd835cec567ba8295a8906ed56c8bf0b Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Wed, 9 Jul 2014 18:20:03 -0400 Subject: [PATCH] Fix: memory leak in lttng_enable_event_with_exclusions MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit lttng_enable_event_with_exclusions leaks a filter expression when automatically generated filter statements are used. This happens when loglevel and logger name filtering are used when enabling JUL events. Signed-off-by: Jérémie Galarneau Signed-off-by: David Goulet --- src/lib/lttng-ctl/lttng-ctl.c | 32 +++++++++++++++++++++----------- 1 file changed, 21 insertions(+), 11 deletions(-) diff --git a/src/lib/lttng-ctl/lttng-ctl.c b/src/lib/lttng-ctl/lttng-ctl.c index 6363d56b3..29f8a10d4 100644 --- a/src/lib/lttng-ctl/lttng-ctl.c +++ b/src/lib/lttng-ctl/lttng-ctl.c @@ -753,7 +753,7 @@ end: */ int lttng_enable_event_with_exclusions(struct lttng_handle *handle, struct lttng_event *ev, const char *channel_name, - const char *filter_expression, + const char *original_filter_expression, int exclusion_count, char **exclusion_list) { struct lttcomm_session_msg lsm; @@ -761,6 +761,13 @@ int lttng_enable_event_with_exclusions(struct lttng_handle *handle, int ret = 0; struct filter_parser_ctx *ctx = NULL; FILE *fmem = NULL; + /* + * Cast as non-const since we may replace the filter expression + * by a dynamically allocated string. Otherwise, the original + * string is not modified. + */ + char *filter_expression = (char *) original_filter_expression; + int free_filter_expression = 0; if (handle == NULL || ev == NULL) { return -LTTNG_ERR_INVALID; @@ -821,21 +828,16 @@ int lttng_enable_event_with_exclusions(struct lttng_handle *handle, /* Setup JUL filter if needed. */ jul_filter = set_jul_filter(filter_expression, ev); - if (!jul_filter) { - if (!filter_expression) { - /* No JUL and no filter, just skip everything below. */ - goto ask_sessiond; - } + if (!jul_filter && !filter_expression) { + /* No JUL and no filter, just skip everything below. */ + goto ask_sessiond; } else { /* * With a JUL filter, the original filter has been added to it * thus replace the filter expression. */ - filter_expression = strdup(jul_filter); - free(jul_filter); - if (!filter_expression) { - return -LTTNG_ERR_FILTER_NOMEM; - } + filter_expression = jul_filter; + free_filter_expression = 1; } } @@ -956,6 +958,14 @@ varlen_alloc_error: if (fclose(fmem) != 0) { perror("fclose"); } + if (free_filter_expression) { + /* + * The filter expression has been replaced and must be + * freed as it is not the original filter expression + * received as a parameter. + */ + free(filter_expression); + } } return ret; -- 2.34.1