Fix: error handling in kernel add_channel
authorJulien Desfossez <jdesfossez@efficios.com>
Thu, 23 May 2013 21:07:08 +0000 (17:07 -0400)
committerDavid Goulet <dgoulet@efficios.com>
Tue, 28 May 2013 17:09:08 +0000 (13:09 -0400)
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@efficios.com>
Signed-off-by: David Goulet <dgoulet@efficios.com>
src/bin/lttng-sessiond/cmd.c
src/common/consumer.c
src/common/kernel-consumer/kernel-consumer.c

index 4eacb3c890ff27f33d5a985b868a68dce7d65abc..cbf2bceff27908a164128ce27328459b4e5cfadf 100644 (file)
@@ -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;
        }
index 990db9e2690eff92ec683b8dd1df1aef65542ab0..5ca2e7bad68187f7b61b628a28ae0932658a3ccb 100644 (file)
@@ -906,7 +906,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;
        }
 
index d9850144bacf975d405164d071bd0353327470de..f3a3a22b55a230a427bad1fe7c7cb844de236d8a 100644 (file)
@@ -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:
This page took 0.030991 seconds and 4 git commands to generate.