[lttng-dev] [LTTNG-TOOLS PATCH] Fix: error handling in kernel add_channel

Julien Desfossez jdesfossez at efficios.com
Thu May 23 17:07:08 EDT 2013


consumer_add_channel can return an error, it needs to be handled.
Also, init_kernel_tracing returns a positive lttng_error_code on error,
so the check in start_kernel_session needs to be for ret != 0.

Signed-off-by: Julien Desfossez <jdesfossez at efficios.com>
---
 src/bin/lttng-sessiond/cmd.c                 |    2 +-
 src/common/consumer.c                        |    2 +-
 src/common/kernel-consumer/kernel-consumer.c |   19 +++++++++++++------
 3 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/src/bin/lttng-sessiond/cmd.c b/src/bin/lttng-sessiond/cmd.c
index 4eacb3c..cbf2bce 100644
--- a/src/bin/lttng-sessiond/cmd.c
+++ b/src/bin/lttng-sessiond/cmd.c
@@ -754,7 +754,7 @@ static int start_kernel_session(struct ltt_kernel_session *ksess, int wpipe)
 
 	/* Setup kernel consumer socket and send fds to it */
 	ret = init_kernel_tracing(ksess);
-	if (ret < 0) {
+	if (ret != 0) {
 		ret = LTTNG_ERR_KERN_START_FAIL;
 		goto error;
 	}
diff --git a/src/common/consumer.c b/src/common/consumer.c
index 84865d3..c9e4bae 100644
--- a/src/common/consumer.c
+++ b/src/common/consumer.c
@@ -903,7 +903,7 @@ int consumer_add_channel(struct lttng_consumer_channel *channel,
 		/* Channel already exist. Ignore the insertion */
 		ERR("Consumer add channel key %" PRIu64 " already exists!",
 			channel->key);
-		ret = -1;
+		ret = LTTNG_ERR_KERN_CHAN_EXIST;
 		goto end;
 	}
 
diff --git a/src/common/kernel-consumer/kernel-consumer.c b/src/common/kernel-consumer/kernel-consumer.c
index d985014..f3a3a22 100644
--- a/src/common/kernel-consumer/kernel-consumer.c
+++ b/src/common/kernel-consumer/kernel-consumer.c
@@ -122,6 +122,7 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
 	case LTTNG_CONSUMER_ADD_CHANNEL:
 	{
 		struct lttng_consumer_channel *new_channel;
+		int ret_recv;
 
 		/* First send a status message before receiving the fds. */
 		ret = consumer_send_status_msg(sock, ret_code);
@@ -129,7 +130,6 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
 			/* Somehow, the session daemon is not responding anymore. */
 			goto end_nosignal;
 		}
-
 		DBG("consumer_add_channel %" PRIu64, msg.u.channel.channel_key);
 		new_channel = consumer_allocate_channel(msg.u.channel.channel_key,
 				msg.u.channel.session_id, msg.u.channel.pathname,
@@ -155,15 +155,22 @@ int lttng_kconsumer_recv_cmd(struct lttng_consumer_local_data *ctx,
 		};
 
 		if (ctx->on_recv_channel != NULL) {
-			ret = ctx->on_recv_channel(new_channel);
-			if (ret == 0) {
-				consumer_add_channel(new_channel, ctx);
-			} else if (ret < 0) {
+			ret_recv = ctx->on_recv_channel(new_channel);
+			if (ret_recv == 0) {
+				ret = consumer_add_channel(new_channel, ctx);
+			} else if (ret_recv < 0) {
 				goto end_nosignal;
 			}
 		} else {
-			consumer_add_channel(new_channel, ctx);
+			ret = consumer_add_channel(new_channel, ctx);
+		}
+
+		/* If we received an error in add_channel, we need to report it. */
+		if (ret != 0) {
+			consumer_send_status_msg(sock, ret);
+			goto end_nosignal;
 		}
+
 		goto end_nosignal;
 	}
 	case LTTNG_CONSUMER_ADD_STREAM:
-- 
1.7.10.4




More information about the lttng-dev mailing list