Fix: relayd: use of relay_session ref count before initialization
[lttng-tools.git] / src / bin / lttng-relayd / session.c
index af2278d46a2f318a91dbc2a5d28d57bed14f2f11..146a5dffc476df4a36956eef961fd12419087679 100644 (file)
@@ -181,17 +181,21 @@ struct relay_session *session_create(const char *session_name,
        int ret;
        struct relay_session *session = NULL;
 
-       if (session_name && strstr(session_name, ".")) {
+       assert(session_name);
+       assert(hostname);
+       assert(base_path);
+
+       if (strstr(session_name, ".")) {
                ERR("Illegal character in session name: \"%s\"",
                                session_name);
                goto error;
        }
-       if (base_path && strstr(base_path, "../")) {
+       if (strstr(base_path, "../")) {
                ERR("Invalid session base path walks up the path hierarchy: \"%s\"",
                                base_path);
                goto error;
        }
-       if (hostname && strstr(hostname, ".")) {
+       if (strstr(hostname, ".")) {
                ERR("Invalid character in hostname: \"%s\"",
                                hostname);
                goto error;
@@ -202,6 +206,17 @@ struct relay_session *session_create(const char *session_name,
                PERROR("Failed to allocate session");
                goto error;
        }
+
+       pthread_mutex_lock(&last_relay_session_id_lock);
+       session->id = ++last_relay_session_id;
+       pthread_mutex_unlock(&last_relay_session_id_lock);
+
+       lttng_ht_node_init_u64(&session->session_n, session->id);
+       urcu_ref_init(&session->ref);
+       CDS_INIT_LIST_HEAD(&session->recv_list);
+       pthread_mutex_init(&session->lock, NULL);
+       pthread_mutex_init(&session->recv_list_lock, NULL);
+
        if (lttng_strncpy(session->session_name, session_name,
                        sizeof(session->session_name))) {
                WARN("Session name exceeds maximal allowed length");
@@ -228,17 +243,8 @@ struct relay_session *session_create(const char *session_name,
                goto error;
        }
 
-       pthread_mutex_lock(&last_relay_session_id_lock);
-       session->id = ++last_relay_session_id;
-       pthread_mutex_unlock(&last_relay_session_id_lock);
-
        session->major = major;
        session->minor = minor;
-       lttng_ht_node_init_u64(&session->session_n, session->id);
-       urcu_ref_init(&session->ref);
-       CDS_INIT_LIST_HEAD(&session->recv_list);
-       pthread_mutex_init(&session->lock, NULL);
-       pthread_mutex_init(&session->recv_list_lock, NULL);
 
        session->live_timer = live_timer;
        session->snapshot = snapshot;
@@ -389,6 +395,9 @@ void session_release(struct urcu_ref *ref)
 
 void session_put(struct relay_session *session)
 {
+       if (!session) {
+               return;
+       }
        rcu_read_lock();
        urcu_ref_put(&session->ref, session_release);
        rcu_read_unlock();
This page took 0.028098 seconds and 4 git commands to generate.