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

Mathieu Desnoyers mathieu.desnoyers at efficios.com
Mon Jul 8 10:48:45 EDT 2013


* Julien Desfossez (jdesfossez at efficios.com) wrote:
> 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.

This patch was merged into stable-2.2 and master of lttng-tools.

> 
> 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
> 
> 
> _______________________________________________
> lttng-dev mailing list
> lttng-dev at lists.lttng.org
> http://lists.lttng.org/cgi-bin/mailman/listinfo/lttng-dev

-- 
Mathieu Desnoyers
EfficiOS Inc.
http://www.efficios.com



More information about the lttng-dev mailing list