From da151cc5d0a127c08de59d6861c20a617c192682 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: Ib6a04969dd82857e3b8ac2ca2545cfb098b2d04f --- src/bin/lttng-sessiond/manage-consumer.c | 21 +++++++++++++++------ src/common/consumer/consumer.c | 9 ++++++--- src/common/consumer/consumer.h | 3 ++- 3 files changed, 23 insertions(+), 10 deletions(-) diff --git a/src/bin/lttng-sessiond/manage-consumer.c b/src/bin/lttng-sessiond/manage-consumer.c index 72e9a8600..6980dfa33 100644 --- a/src/bin/lttng-sessiond/manage-consumer.c +++ b/src/bin/lttng-sessiond/manage-consumer.c @@ -161,9 +161,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 */ + { + int32_t comm_code = 0; + + ret = lttcomm_recv_unix_sock(sock, &comm_code, sizeof(comm_code)); + code = (typeof(code)) comm_code; + } if (ret <= 0) { mark_thread_intialization_as_failed(notifiers); goto error; @@ -308,9 +312,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 */ + { + int32_t comm_code = 0; + + ret = lttcomm_recv_unix_sock( + sock, &comm_code, sizeof(comm_code)); + code = (typeof(code)) comm_code; + } if (ret <= 0) { ERR("consumer closed the command socket"); goto error; diff --git a/src/common/consumer/consumer.c b/src/common/consumer/consumer.c index fcb100e1a..c457f754d 100644 --- a/src/common/consumer/consumer.c +++ b/src/common/consumer/consumer.c @@ -1272,11 +1272,14 @@ void lttng_consumer_set_command_sock_path( * 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) { - return lttcomm_send_unix_sock(ctx->consumer_error_socket, &cmd, - sizeof(enum lttcomm_sessiond_command)); + const int32_t comm_code = (int32_t) error_code; + + return lttcomm_send_unix_sock( + ctx->consumer_error_socket, &comm_code, sizeof(comm_code)); } return 0; diff --git a/src/common/consumer/consumer.h b/src/common/consumer/consumer.h index 7bfd28379..5026f70e4 100644 --- a/src/common/consumer/consumer.h +++ b/src/common/consumer/consumer.h @@ -905,7 +905,8 @@ void lttng_consumer_set_command_sock_path( * 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