ssize_t sock_recv_len;
enum lttng_error_code ret_code;
struct lttng_payload event_context_payload;
+ struct lttng_event_context *context = NULL;
lttng_payload_init(&event_context_payload);
/* Deserialize event. */
{
+ ssize_t len;
struct lttng_payload_view event_context_view =
lttng_payload_view_from_payload(
&event_context_payload, 0, -1);
- if (lttng_event_context_create_from_payload(
- &event_context_view, out_event_context) !=
- event_context_len) {
- ERR("Invalid event context received as part of command payload");
+ len = lttng_event_context_create_from_payload(
+ &event_context_view, &context);
+
+ if (len < 0) {
+ ERR("Failed to create a event context from the received buffer");
+ ret_code = LTTNG_ERR_INVALID_PROTOCOL;
+ goto end;
+ }
+
+ if (len != event_context_len) {
+ ERR("Event context from the received buffer is not the advertised length: expected length = %zu, payload length = %zd", event_context_len, len);
ret_code = LTTNG_ERR_INVALID_PROTOCOL;
goto end;
}
}
+ *out_event_context = context;
+ context = NULL;
ret_code = LTTNG_OK;
end:
+ lttng_event_context_destroy(context);
lttng_payload_reset(&event_context_payload);
return ret_code;
}
switch (cmd_ctx->lsm.cmd_type) {
case LTTNG_ADD_CONTEXT:
{
- struct lttng_event_context *event_context;
+ struct lttng_event_context *event_context = NULL;
const enum lttng_error_code ret_code =
receive_lttng_event_context(
cmd_ctx, *sock, sock_error, &event_context);
}
case LTTNG_LIST_TRACEPOINT_FIELDS:
{
- struct lttng_event_field *fields;
- ssize_t nb_fields;
+ enum lttng_error_code ret_code;
+ size_t original_payload_size;
+ size_t payload_size;
+ const size_t command_header_size = sizeof(struct lttcomm_list_command_header);
+
+ ret = setup_empty_lttng_msg(cmd_ctx);
+ if (ret) {
+ ret = LTTNG_ERR_NOMEM;
+ goto setup_error;
+ }
+
+ original_payload_size = cmd_ctx->reply_payload.buffer.size;
session_lock_list();
- nb_fields = cmd_list_tracepoint_fields(cmd_ctx->lsm.domain.type,
- &fields);
+ ret_code = cmd_list_tracepoint_fields(
+ cmd_ctx->lsm.domain.type, &cmd_ctx->reply_payload);
session_unlock_list();
- if (nb_fields < 0) {
- /* Return value is a negative lttng_error_code. */
- ret = -nb_fields;
+ if (ret_code != LTTNG_OK) {
+ ret = (int) ret_code;
goto error;
}
- /*
- * Setup lttng message with payload size set to the event list size in
- * bytes and then copy list into the llm payload.
- */
- ret = setup_lttng_msg_no_cmd_header(cmd_ctx, fields,
- sizeof(struct lttng_event_field) * nb_fields);
- free(fields);
-
- if (ret < 0) {
- goto setup_error;
- }
+ payload_size = cmd_ctx->reply_payload.buffer.size -
+ command_header_size - original_payload_size;
+ update_lttng_msg(cmd_ctx, command_header_size, payload_size);
ret = LTTNG_OK;
break;