From fbd566c25787aa7134e84efcfb7d3569f27d3350 Mon Sep 17 00:00:00 2001 From: =?utf8?q?J=C3=A9r=C3=A9mie=20Galarneau?= Date: Tue, 7 Mar 2023 14:38:32 -0500 Subject: [PATCH] Fix: consumerd: type confusion in lttng_consumer_send_error MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit lttng_consumer_send_error sends an lttcomm_return_code to the session daemon. However, the size of lttcomm_sessiond_command was used. This was probably missed since the function accepts an integer instead of a proper enum type. The size accepted by the function is changed to use lttcomm_return_code and the size of a fixed-size type is used to send the error code to the session daemon. Signed-off-by: Jérémie Galarneau Change-Id: I318e6a8d145373779d11557a70e43abca9783e5c --- src/bin/lttng-sessiond/manage-consumer.cpp | 20 +++++++++++++++----- src/common/consumer/consumer.cpp | 11 +++++++++-- src/common/consumer/consumer.hpp | 3 ++- 3 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/bin/lttng-sessiond/manage-consumer.cpp b/src/bin/lttng-sessiond/manage-consumer.cpp index b7eb10800..27a368e7f 100644 --- a/src/bin/lttng-sessiond/manage-consumer.cpp +++ b/src/bin/lttng-sessiond/manage-consumer.cpp @@ -164,8 +164,13 @@ static void *thread_consumer_management(void *data) DBG2("Receiving code from consumer err_sock"); - /* Getting status code from kconsumerd */ - ret = lttcomm_recv_unix_sock(sock, &code, sizeof(enum lttcomm_return_code)); + /* Getting status code from consumerd */ + { + std::int32_t comm_code = 0; + + ret = lttcomm_recv_unix_sock(sock, &comm_code, sizeof(comm_code)); + code = static_cast(comm_code); + } if (ret <= 0) { mark_thread_intialization_as_failed(notifiers); goto error; @@ -304,9 +309,14 @@ static void *thread_consumer_management(void *data) goto error; } health_code_update(); - /* Wait for any kconsumerd error */ - ret = lttcomm_recv_unix_sock( - sock, &code, sizeof(enum lttcomm_return_code)); + /* Wait for any consumerd error */ + { + std::int32_t comm_code = 0; + + ret = lttcomm_recv_unix_sock( + sock, &comm_code, sizeof(comm_code)); + code = static_cast(comm_code); + } if (ret <= 0) { ERR("consumer closed the command socket"); goto error; diff --git a/src/common/consumer/consumer.cpp b/src/common/consumer/consumer.cpp index 7e7e7d384..ed844f8df 100644 --- a/src/common/consumer/consumer.cpp +++ b/src/common/consumer/consumer.cpp @@ -45,6 +45,7 @@ #include #include #include +#include #include lttng_consumer_global_data the_consumer_data; @@ -1255,11 +1256,17 @@ void lttng_consumer_set_command_sock_path(struct lttng_consumer_local_data *ctx, * Send return code to the session daemon. * If the socket is not defined, we return 0, it is not a fatal error */ -int lttng_consumer_send_error(struct lttng_consumer_local_data *ctx, int cmd) +int lttng_consumer_send_error(struct lttng_consumer_local_data *ctx, + enum lttcomm_return_code error_code) { if (ctx->consumer_error_socket > 0) { + const std::int32_t comm_code = std::int32_t(error_code); + + static_assert( + sizeof(comm_code) >= sizeof(std::underlying_type), + "Fixed-size communication type too small to accomodate lttcomm_return_code"); return lttcomm_send_unix_sock( - ctx->consumer_error_socket, &cmd, sizeof(enum lttcomm_sessiond_command)); + ctx->consumer_error_socket, &comm_code, sizeof(comm_code)); } return 0; diff --git a/src/common/consumer/consumer.hpp b/src/common/consumer/consumer.hpp index c62e01453..310969172 100644 --- a/src/common/consumer/consumer.hpp +++ b/src/common/consumer/consumer.hpp @@ -921,7 +921,8 @@ void lttng_consumer_set_command_sock_path(struct lttng_consumer_local_data *ctx, * Returns the return code of sendmsg : the number of bytes transmitted or -1 * on error. */ -int lttng_consumer_send_error(struct lttng_consumer_local_data *ctx, int cmd); +int lttng_consumer_send_error(struct lttng_consumer_local_data *ctx, + enum lttcomm_return_code error_code); /* * Called from signal handler to ensure a clean exit. -- 2.34.1