Fix: uninitialized return value on error path
[lttng-tools.git] / src / bin / lttng-sessiond / context.c
index 9a5738799192a7a26de2cab6e04b361477ac6bd7..1e68bd8bb9ff2b9090146da82c36e8c90104a4c5 100644 (file)
@@ -34,6 +34,8 @@
 
 /*
  * Add kernel context to all channel.
+ *
+ * Assumes the ownership of kctx.
  */
 static int add_kctx_all_channels(struct ltt_kernel_session *ksession,
                struct ltt_kernel_context *kctx)
@@ -48,9 +50,19 @@ static int add_kctx_all_channels(struct ltt_kernel_session *ksession,
 
        /* Go over all channels */
        cds_list_for_each_entry(kchan, &ksession->channel_list.head, list) {
-               ret = kernel_add_channel_context(kchan, kctx);
-               if (ret < 0) {
-                       ret = LTTNG_ERR_KERN_CONTEXT_FAIL;
+               struct ltt_kernel_context *kctx_copy;
+
+               kctx_copy = trace_kernel_copy_context(kctx);
+               if (!kctx_copy) {
+                       PERROR("zmalloc ltt_kernel_context");
+                       ret = -ENOMEM;
+                       goto error;
+               }
+
+               /* Ownership of kctx_copy is transferred to the callee. */
+               ret = kernel_add_channel_context(kchan, kctx_copy);
+               kctx_copy = NULL;
+               if (ret != 0) {
                        goto error;
                }
        }
@@ -58,11 +70,14 @@ static int add_kctx_all_channels(struct ltt_kernel_session *ksession,
        ret = LTTNG_OK;
 
 error:
+       trace_kernel_destroy_context(kctx);
        return ret;
 }
 
 /*
  * Add kernel context to a specific channel.
+ *
+ * Assumes the ownership of kctx.
  */
 static int add_kctx_to_channel(struct ltt_kernel_context *kctx,
                struct ltt_kernel_channel *kchan)
@@ -74,9 +89,10 @@ static int add_kctx_to_channel(struct ltt_kernel_context *kctx,
 
        DBG("Add kernel context to channel '%s'", kchan->channel->name);
 
+       /* Ownership of kctx is transferred to the callee. */
        ret = kernel_add_channel_context(kchan, kctx);
-       if (ret < 0) {
-               ret = LTTNG_ERR_KERN_CONTEXT_FAIL;
+       kctx = NULL;
+       if (ret != 0) {
                goto error;
        }
 
@@ -231,6 +247,18 @@ int context_kernel_add(struct ltt_kernel_session *ksession,
        case LTTNG_EVENT_CONTEXT_PERF_COUNTER:
                kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_PERF_CPU_COUNTER;
                break;
+       case LTTNG_EVENT_CONTEXT_INTERRUPTIBLE:
+               kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_INTERRUPTIBLE;
+               break;
+       case LTTNG_EVENT_CONTEXT_PREEMPTIBLE:
+               kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_PREEMPTIBLE;
+               break;
+       case LTTNG_EVENT_CONTEXT_NEED_RESCHEDULE:
+               kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_NEED_RESCHEDULE;
+               break;
+       case LTTNG_EVENT_CONTEXT_MIGRATABLE:
+               kctx->ctx.ctx = LTTNG_KERNEL_CONTEXT_MIGRATABLE;
+               break;
        default:
                ret = LTTNG_ERR_KERN_CONTEXT_FAIL;
                goto error;
@@ -244,6 +272,8 @@ int context_kernel_add(struct ltt_kernel_session *ksession,
 
        if (*channel_name == '\0') {
                ret = add_kctx_all_channels(ksession, kctx);
+               /* Ownership of kctx is transferred to the callee. */
+               kctx = NULL;
                if (ret != LTTNG_OK) {
                        goto error;
                }
@@ -256,12 +286,14 @@ int context_kernel_add(struct ltt_kernel_session *ksession,
                }
 
                ret = add_kctx_to_channel(kctx, kchan);
+               /* Ownership of kctx is transferred to the callee. */
+               kctx = NULL;
                if (ret != LTTNG_OK) {
                        goto error;
                }
        }
 
-       return LTTNG_OK;
+       ret = LTTNG_OK;
 
 error:
        if (kctx) {
This page took 0.024638 seconds and 4 git commands to generate.