Fix: force the client to create a viewer session before attaching
[lttng-tools.git] / src / bin / lttng-relayd / live.c
index b3b7ee427268ff6d24169a037b44eab134eddef9..b2e8e7c8bb1305b07c121172ecb1d2e760339348 100644 (file)
@@ -926,6 +926,12 @@ int viewer_attach_session(struct relay_connection *conn)
 
        health_code_update();
 
+       if (!conn->viewer_session) {
+               DBG("Client trying to attach before creating a live viewer session");
+               response.status = htobe32(LTTNG_VIEWER_ATTACH_NO_SESSION);
+               goto send_reply;
+       }
+
        rcu_read_lock();
        session = session_find_by_id(conn->sessions_ht,
                        be64toh(request.session_id));
@@ -1491,6 +1497,42 @@ end:
        return ret;
 }
 
+/*
+ * Create a viewer session.
+ *
+ * Return 0 on success or else a negative value.
+ */
+static
+int viewer_create_session(struct relay_connection *conn)
+{
+       int ret;
+       struct lttng_viewer_create_session_response resp;
+
+       DBG("Viewer create session received");
+
+       resp.status = htobe32(LTTNG_VIEWER_CREATE_SESSION_OK);
+       conn->viewer_session = zmalloc(sizeof(conn->viewer_session));
+       if (!conn->viewer_session) {
+               ERR("Allocation viewer session");
+               resp.status = htobe32(LTTNG_VIEWER_CREATE_SESSION_ERR);
+               goto send_reply;
+       }
+       CDS_INIT_LIST_HEAD(&conn->viewer_session->sessions_head);
+
+send_reply:
+       health_code_update();
+       ret = send_response(conn->sock, &resp, sizeof(resp));
+       if (ret < 0) {
+               goto end;
+       }
+       health_code_update();
+       ret = 0;
+
+end:
+       return ret;
+}
+
+
 /*
  * live_relay_unknown_command: send -1 if received unknown command
  */
@@ -1550,6 +1592,9 @@ int process_control(struct lttng_viewer_cmd *recv_hdr,
        case LTTNG_VIEWER_GET_NEW_STREAMS:
                ret = viewer_get_new_streams(conn);
                break;
+       case LTTNG_VIEWER_CREATE_SESSION:
+               ret = viewer_create_session(conn);
+               break;
        default:
                ERR("Received unknown viewer command (%u)", be32toh(recv_hdr->cmd));
                live_relay_unknown_command(conn);
This page took 0.023227 seconds and 4 git commands to generate.