Fix: add missing rcu lock for UST lookup
[lttng-tools.git] / src / bin / lttng-sessiond / trace-ust.c
index 1fda555ea0e987bdcc11565b43ffea84b1d85765..e07d27e678b93c718ff3dee1378706b3382a3692 100644 (file)
@@ -116,7 +116,8 @@ no_match:
 }
 
 /*
- * Find the channel in the hashtable.
+ * Find the channel in the hashtable and return channel pointer. RCU read side
+ * lock MUST be acquired before calling this.
  */
 struct ltt_ust_channel *trace_ust_find_channel_by_name(struct lttng_ht *ht,
                char *name)
@@ -124,14 +125,11 @@ struct ltt_ust_channel *trace_ust_find_channel_by_name(struct lttng_ht *ht,
        struct lttng_ht_node_str *node;
        struct lttng_ht_iter iter;
 
-       rcu_read_lock();
        lttng_ht_lookup(ht, (void *)name, &iter);
        node = lttng_ht_iter_get_node_str(&iter);
        if (node == NULL) {
-               rcu_read_unlock();
                goto error;
        }
-       rcu_read_unlock();
 
        DBG2("Trace UST channel %s found by name", name);
 
@@ -143,7 +141,8 @@ error:
 }
 
 /*
- * Find the event in the hashtable.
+ * Find the event in the hashtable and return event pointer. RCU read side lock
+ * MUST be acquired before calling this.
  */
 struct ltt_ust_event *trace_ust_find_event(struct lttng_ht *ht,
                char *name, struct lttng_filter_bytecode *filter, int loglevel)
@@ -181,9 +180,8 @@ error:
  * Return pointer to structure or NULL.
  */
 struct ltt_ust_session *trace_ust_create_session(char *path,
-               unsigned int session_id, struct lttng_domain *domain)
+               unsigned int session_id)
 {
-       int ret;
        struct ltt_ust_session *lus;
 
        /* Allocate a new ltt ust session */
@@ -219,6 +217,8 @@ struct ltt_ust_session *trace_ust_create_session(char *path,
 
        /* Use the default consumer output which is the tracing session path. */
        if (path && strlen(path) > 0) {
+               int ret;
+
                ret = snprintf(lus->consumer->dst.trace_path, PATH_MAX,
                                "%s" DEFAULT_UST_TRACE_DIR, path);
                if (ret < 0) {
@@ -261,6 +261,9 @@ struct ltt_ust_channel *trace_ust_create_channel(struct lttng_channel *chan,
        int ret;
        struct ltt_ust_channel *luc;
 
+       assert(chan);
+       assert(path);
+
        luc = zmalloc(sizeof(struct ltt_ust_channel));
        if (luc == NULL) {
                PERROR("ltt_ust_channel zmalloc");
@@ -321,6 +324,8 @@ struct ltt_ust_event *trace_ust_create_event(struct lttng_event *ev,
 {
        struct ltt_ust_event *lue;
 
+       assert(ev);
+
        lue = zmalloc(sizeof(struct ltt_ust_event));
        if (lue == NULL) {
                PERROR("ust event zmalloc");
@@ -395,6 +400,8 @@ struct ltt_ust_metadata *trace_ust_create_metadata(char *path)
        int ret;
        struct ltt_ust_metadata *lum;
 
+       assert(path);
+
        lum = zmalloc(sizeof(struct ltt_ust_metadata));
        if (lum == NULL) {
                PERROR("ust metadata zmalloc");
@@ -436,6 +443,8 @@ struct ltt_ust_context *trace_ust_create_context(
        struct ltt_ust_context *uctx;
        enum lttng_ust_context_type utype;
 
+       assert(ctx);
+
        switch (ctx->ctx) {
        case LTTNG_EVENT_CONTEXT_VTID:
                utype = LTTNG_UST_CONTEXT_VTID;
@@ -491,6 +500,8 @@ static void destroy_contexts(struct lttng_ht *ht)
        struct lttng_ht_node_ulong *node;
        struct lttng_ht_iter iter;
 
+       assert(ht);
+
        cds_lfht_for_each_entry(ht->ht, &iter.iter, node, node) {
                ret = lttng_ht_del(ht, &iter);
                if (!ret) {
@@ -506,6 +517,8 @@ static void destroy_contexts(struct lttng_ht *ht)
  */
 void trace_ust_destroy_event(struct ltt_ust_event *event)
 {
+       assert(event);
+
        DBG2("Trace destroy UST event %s", event->attr.name);
        free(event->filter);
        free(event);
@@ -533,6 +546,8 @@ static void destroy_events(struct lttng_ht *events)
        struct lttng_ht_node_str *node;
        struct lttng_ht_iter iter;
 
+       assert(events);
+
        cds_lfht_for_each_entry(events->ht, &iter.iter, node, node) {
                ret = lttng_ht_del(events, &iter);
                assert(!ret);
@@ -547,6 +562,8 @@ static void destroy_events(struct lttng_ht *events)
  */
 void trace_ust_destroy_channel(struct ltt_ust_channel *channel)
 {
+       assert(channel);
+
        DBG2("Trace destroy UST channel %s", channel->name);
 
        rcu_read_lock();
@@ -579,6 +596,8 @@ static void destroy_channel_rcu(struct rcu_head *head)
  */
 void trace_ust_destroy_metadata(struct ltt_ust_metadata *metadata)
 {
+       assert(metadata);
+
        if (!metadata->handle) {
                return;
        }
@@ -595,6 +614,8 @@ static void destroy_channels(struct lttng_ht *channels)
        struct lttng_ht_node_str *node;
        struct lttng_ht_iter iter;
 
+       assert(channels);
+
        rcu_read_lock();
 
        cds_lfht_for_each_entry(channels->ht, &iter.iter, node, node) {
@@ -617,6 +638,8 @@ static void destroy_domain_pid(struct lttng_ht *ht)
        struct lttng_ht_iter iter;
        struct ltt_ust_domain_pid *dpid;
 
+       assert(ht);
+
        cds_lfht_for_each_entry(ht->ht, &iter.iter, dpid, node.node) {
                ret = lttng_ht_del(ht , &iter);
                assert(!ret);
@@ -635,6 +658,8 @@ static void destroy_domain_exec(struct lttng_ht *ht)
        struct lttng_ht_iter iter;
        struct ltt_ust_domain_exec *dexec;
 
+       assert(ht);
+
        cds_lfht_for_each_entry(ht->ht, &iter.iter, dexec, node.node) {
                ret = lttng_ht_del(ht , &iter);
                assert(!ret);
@@ -649,6 +674,8 @@ static void destroy_domain_exec(struct lttng_ht *ht)
  */
 static void destroy_domain_global(struct ltt_ust_domain_global *dom)
 {
+       assert(dom);
+
        destroy_channels(dom->channels);
 }
 
@@ -657,10 +684,7 @@ static void destroy_domain_global(struct ltt_ust_domain_global *dom)
  */
 void trace_ust_destroy_session(struct ltt_ust_session *session)
 {
-       /* Extra protection */
-       if (session == NULL) {
-               return;
-       }
+       assert(session);
 
        rcu_read_lock();
 
This page took 0.027762 seconds and 4 git commands to generate.