2 * Copyright (C) 2018 Jonathan Rajotte <jonathan.rajotte-julien@efficios.com>
4 * SPDX-License-Identifier: GPL-2.0-only
11 #include <common/common.hpp>
12 #include <common/sessiond-comm/relayd.hpp>
14 #include <common/compat/endian.hpp>
15 #include <common/compat/string.hpp>
16 #include <lttng/constant.h>
18 #include "cmd-2-15.hpp"
21 int cmd_create_session_2_15(const struct lttng_buffer_view
*payload
,
27 uint64_t *id_sessiond
,
28 lttng_uuid
& sessiond_uuid
,
29 bool *has_current_chunk
,
30 uint64_t *current_chunk_id
,
31 time_t *creation_time
,
32 bool *session_name_contains_creation_time
,
33 relayd_trace_format
& trace_format
)
36 struct lttcomm_relayd_create_session_2_15 header
;
37 size_t header_len
, received_names_size
, offset
;
38 struct lttng_buffer_view session_name_view
;
39 struct lttng_buffer_view hostname_view
;
40 struct lttng_buffer_view base_path_view
;
42 header_len
= sizeof(header
);
44 if (payload
->size
< header_len
) {
45 ERR("Unexpected payload size in \"cmd_create_session_2_15\": expected >= %zu bytes, got %zu bytes",
46 header_len
, payload
->size
);
50 memcpy(&header
, payload
->data
, header_len
);
52 header
.session_name_len
= be32toh(header
.session_name_len
);
53 header
.hostname_len
= be32toh(header
.hostname_len
);
54 header
.base_path_len
= be32toh(header
.base_path_len
);
55 header
.live_timer
= be32toh(header
.live_timer
);
56 header
.current_chunk_id
.value
= be64toh(header
.current_chunk_id
.value
);
57 header
.current_chunk_id
.is_set
= !!header
.current_chunk_id
.is_set
;
58 header
.creation_time
= be64toh(header
.creation_time
);
59 header
.session_id
= be64toh(header
.session_id
);
61 std::copy(std::begin(header
.sessiond_uuid
), std::end(header
.sessiond_uuid
),
62 sessiond_uuid
.begin());
64 received_names_size
= header
.session_name_len
+ header
.hostname_len
+ header
.base_path_len
;
65 if (payload
->size
< header_len
+ received_names_size
) {
66 ERR("Unexpected payload size in \"cmd_create_session_2_15\": expected >= %zu bytes, got %zu bytes",
67 header_len
+ received_names_size
, payload
->size
);
72 /* Validate length against defined constant. */
73 if (header
.session_name_len
> LTTNG_NAME_MAX
) {
75 ERR("Length of session name (%" PRIu32
76 " bytes) received in create_session command exceeds maximum length (%d bytes)",
77 header
.session_name_len
, LTTNG_NAME_MAX
);
79 } else if (header
.session_name_len
== 0) {
81 ERR("Illegal session name length of 0 received");
84 if (header
.hostname_len
> LTTNG_HOST_NAME_MAX
) {
86 ERR("Length of hostname (%" PRIu32
87 " bytes) received in create_session command exceeds maximum length (%d bytes)",
88 header
.hostname_len
, LTTNG_HOST_NAME_MAX
);
91 if (header
.base_path_len
> LTTNG_PATH_MAX
) {
93 ERR("Length of base_path (%" PRIu32
94 " bytes) received in create_session command exceeds maximum length (%d bytes)",
95 header
.base_path_len
, PATH_MAX
);
100 session_name_view
= lttng_buffer_view_from_view(payload
, offset
, header
.session_name_len
);
101 if (!lttng_buffer_view_is_valid(&session_name_view
)) {
102 ERR("Invalid payload in \"cmd_create_session_2_15\": buffer too short to contain session name");
107 offset
+= header
.session_name_len
;
108 hostname_view
= lttng_buffer_view_from_view(payload
, offset
, header
.hostname_len
);
109 if (!lttng_buffer_view_is_valid(&hostname_view
)) {
110 ERR("Invalid payload in \"cmd_create_session_2_15\": buffer too short to contain hostname");
115 offset
+= header
.hostname_len
;
116 base_path_view
= lttng_buffer_view_from_view(payload
, offset
, header
.base_path_len
);
117 if (header
.base_path_len
> 0 && !lttng_buffer_view_is_valid(&base_path_view
)) {
118 ERR("Invalid payload in \"cmd_create_session_2_15\": buffer too short to contain base path");
123 /* Validate that names are NULL terminated. */
124 if (session_name_view
.data
[session_name_view
.size
- 1] != '\0') {
125 ERR("cmd_create_session_2_15 session_name is invalid (not NULL terminated)");
130 if (hostname_view
.data
[hostname_view
.size
- 1] != '\0') {
131 ERR("cmd_create_session_2_15 hostname is invalid (not NULL terminated)");
136 if (base_path_view
.size
!= 0 && base_path_view
.data
[base_path_view
.size
- 1] != '\0') {
137 ERR("cmd_create_session_2_15 base_path is invalid (not NULL terminated)");
143 * Length and null-termination check are already performed.
144 * LTTNG_NAME_MAX, LTTNG_HOST_NAME_MAX, and LTTNG_PATH_MAX max sizes are
147 strcpy(session_name
, session_name_view
.data
);
148 strcpy(hostname
, hostname_view
.data
);
149 strcpy(base_path
, base_path_view
.size
? base_path_view
.data
: "");
151 *live_timer
= header
.live_timer
;
152 *snapshot
= !!header
.snapshot
;
153 *current_chunk_id
= header
.current_chunk_id
.value
;
154 *has_current_chunk
= header
.current_chunk_id
.is_set
;
155 *creation_time
= (time_t) header
.creation_time
;
156 *session_name_contains_creation_time
= header
.session_name_contains_creation_time
;
157 *id_sessiond
= header
.session_id
;
158 trace_format
= static_cast<enum relayd_trace_format
>(header
.trace_format
);