*/
#define _GNU_SOURCE
+#define _LGPL_SOURCE
#include <assert.h>
#include <inttypes.h>
#include <urcu/list.h>
/*
* Command LTTNG_ENABLE_EVENT processed by the client thread.
+ * We own filter, exclusion, and filter_expression.
*/
int cmd_enable_event(struct ltt_session *session, struct lttng_domain *domain,
char *channel_name, struct lttng_event *event,
/* At this point, the session and channel exist on the tracer */
ret = event_ust_enable_tracepoint(usess, uchan, event,
filter_expression, filter, exclusion);
+ /* We have passed ownership */
+ filter_expression = NULL;
+ filter = NULL;
+ exclusion = NULL;
if (ret != LTTNG_OK) {
goto error;
}
assert(0);
}
- ret = cmd_enable_event(session, &tmp_dom, (char *) default_chan_name,
- &uevent, filter_expression, filter, NULL, wpipe);
+ {
+ struct lttng_filter_bytecode *filter_copy = NULL;
+
+ if (filter) {
+ filter_copy = zmalloc(
+ sizeof(struct lttng_filter_bytecode)
+ + filter->len);
+ if (!filter_copy) {
+ goto error;
+ }
+
+ memcpy(filter_copy, filter,
+ sizeof(struct lttng_filter_bytecode)
+ + filter->len);
+ }
+
+ ret = cmd_enable_event(session, &tmp_dom,
+ (char *) default_chan_name,
+ &uevent, filter_expression, filter_copy,
+ NULL, wpipe);
+ /* We have passed ownership */
+ filter_expression = NULL;
+ }
+
if (ret != LTTNG_OK && ret != LTTNG_ERR_UST_EVENT_ENABLED) {
goto error;
}
/* The wild card * means that everything should be enabled. */
if (strncmp(event->name, "*", 1) == 0 && strlen(event->name) == 1) {
ret = event_agent_enable_all(usess, agt, event, filter);
+ filter = NULL;
} else {
ret = event_agent_enable(usess, agt, event, filter);
+ filter = NULL;
}
if (ret != LTTNG_OK) {
goto error;
ret = LTTNG_OK;
error:
+ free(filter_expression);
+ free(filter);
+ free(exclusion);
rcu_read_unlock();
return ret;
}
* possible to enable channel thus inform the client.
*/
if (usess && usess->domain_global.channels) {
+ rcu_read_lock();
nb_chan += lttng_ht_get_count(usess->domain_global.channels);
+ rcu_read_unlock();
}
if (ksession) {
nb_chan += ksession->channel_count;