Fix: leak of filter bytecode and expression on agent event re-enable
[lttng-tools.git] / src / bin / lttng-sessiond / event.c
index 0a46ffb4bc0fb338c7b47af262dc49c14df5ec46..b0b37bed777a4eb5b537b0739c14115b5e3020a2 100644 (file)
@@ -162,7 +162,7 @@ int event_ust_enable_tracepoint(struct ltt_ust_session *usess,
                struct lttng_event_exclusion *exclusion,
                bool internal_event)
 {
-       int ret, to_create = 0;
+       int ret = LTTNG_OK, to_create = 0;
        struct ltt_ust_event *uevent;
 
        assert(usess);
@@ -195,6 +195,14 @@ int event_ust_enable_tracepoint(struct ltt_ust_session *usess,
        }
 
        uevent->enabled = 1;
+       if (to_create) {
+               /* Add ltt ust event to channel */
+               add_unique_ust_event(uchan->events, uevent);
+       }
+
+       if (!usess->active) {
+               goto end;
+       }
 
        if (to_create) {
                /* Create event on all UST registered apps for session */
@@ -214,11 +222,6 @@ int event_ust_enable_tracepoint(struct ltt_ust_session *usess,
                }
        }
 
-       if (to_create) {
-               /* Add ltt ust event to channel */
-               add_unique_ust_event(uchan->events, uevent);
-       }
-
        DBG("Event UST %s %s in channel %s", uevent->attr.name,
                        to_create ? "created" : "enabled", uchan->name);
 
@@ -291,17 +294,18 @@ int event_ust_disable_tracepoint(struct ltt_ust_session *usess,
                        /* It's already disabled so everything is OK */
                        goto next;
                }
+               uevent->enabled = 0;
+               DBG2("Event UST %s disabled in channel %s", uevent->attr.name,
+                               uchan->name);
 
+               if (!usess->active) {
+                       goto next;
+               }
                ret = ust_app_disable_event_glb(usess, uchan, uevent);
                if (ret < 0 && ret != -LTTNG_UST_ERR_EXIST) {
                        ret = LTTNG_ERR_UST_DISABLE_FAIL;
                        goto error;
                }
-               uevent->enabled = 0;
-
-               DBG2("Event UST %s disabled in channel %s", uevent->attr.name,
-                               uchan->name);
-
 next:
                /* Get next duplicate event by name. */
                cds_lfht_next_duplicate(ht->ht, trace_ust_ht_match_event_by_name,
@@ -502,15 +506,11 @@ int event_agent_enable(struct ltt_ust_session *usess,
                        ret = LTTNG_ERR_NOMEM;
                        goto error;
                }
-
+               filter = NULL;
+               filter_expression = NULL;
                created = 1;
        }
 
-       /* Already enabled? */
-       if (aevent->enabled) {
-               goto end;
-       }
-
        if (created && filter) {
                ret = add_filter_app_ctx(filter, filter_expression, agt);
                if (ret != LTTNG_OK) {
@@ -518,6 +518,12 @@ int event_agent_enable(struct ltt_ust_session *usess,
                }
        }
 
+       /* Already enabled? */
+       if (aevent->enabled) {
+               ret = LTTNG_OK;
+               goto end;
+       }
+
        ret = agent_enable_event(aevent, agt->domain);
        if (ret != LTTNG_OK) {
                goto error;
@@ -528,13 +534,16 @@ int event_agent_enable(struct ltt_ust_session *usess,
                agent_add_event(aevent, agt);
        }
 
-end:
-       return LTTNG_OK;
+       ret = LTTNG_OK;
+       goto end;
 
 error:
        if (created) {
                agent_destroy_event(aevent);
        }
+end:
+       free(filter);
+       free(filter_expression);
        return ret;
 }
 
@@ -629,10 +638,12 @@ static int event_agent_disable_one(struct ltt_ust_session *usess,
        /* If the agent event exists, it must be available on the UST side. */
        assert(uevent);
 
-       ret = ust_app_disable_event_glb(usess, uchan, uevent);
-       if (ret < 0 && ret != -LTTNG_UST_ERR_EXIST) {
-               ret = LTTNG_ERR_UST_DISABLE_FAIL;
-               goto error;
+       if (usess->active) {
+               ret = ust_app_disable_event_glb(usess, uchan, uevent);
+               if (ret < 0 && ret != -LTTNG_UST_ERR_EXIST) {
+                       ret = LTTNG_ERR_UST_DISABLE_FAIL;
+                       goto error;
+               }
        }
 
        /*
This page took 0.026254 seconds and 5 git commands to generate.