Fix: missing rcu_read_lock when calling trace_ust_find_agent()
[lttng-tools.git] / src / bin / lttng-sessiond / agent-thread.c
index 6790a63c642bd78bb37484a6c6af0b1af39081c7..2c018e9c686050263651f9c7ec54552ef45b536c 100644 (file)
@@ -60,10 +60,12 @@ static void update_agent_app(struct agent_app *app)
                if (session->ust_session) {
                        struct agent *agt;
 
+                       rcu_read_lock();
                        agt = trace_ust_find_agent(session->ust_session, app->domain);
                        if (agt) {
                                agent_update(agt, app->sock->fd);
                        }
+                       rcu_read_unlock();
                }
                session_unlock(session);
        }
@@ -198,6 +200,7 @@ static int handle_registration(struct lttcomm_sock *reg_sock,
 {
        int ret;
        pid_t pid;
+       uint32_t major_version, minor_version;
        ssize_t size;
        enum lttng_domain_type domain;
        struct agent_app *app;
@@ -214,11 +217,23 @@ static int handle_registration(struct lttcomm_sock *reg_sock,
 
        size = new_sock->ops->recvmsg(new_sock, &msg, sizeof(msg), 0);
        if (size < sizeof(msg)) {
-               ret = -errno;
+               ret = -EINVAL;
                goto error_socket;
        }
        domain = be32toh(msg.domain);
        pid = be32toh(msg.pid);
+       major_version = be32toh(msg.major_version);
+       minor_version = be32toh(msg.minor_version);
+
+       /* Test communication protocol version of the registring agent. */
+       if (major_version != AGENT_MAJOR_VERSION) {
+               ret = -EINVAL;
+               goto error_socket;
+       }
+       if (minor_version != AGENT_MINOR_VERSION) {
+               ret = -EINVAL;
+               goto error_socket;
+       }
 
        DBG2("[agent-thread] New registration for pid %d domain %d on socket %d",
                        pid, domain, new_sock->fd);
This page took 0.026094 seconds and 4 git commands to generate.