Fix: lttng list of channels should return errors
[lttng-tools.git] / src / bin / lttng-sessiond / cmd.c
index f3ff25642e701a0f83e78bbfd02144c1a118dfdb..9e761958a19ffc1138f62186c9ddecc47b9515c4 100644 (file)
@@ -243,11 +243,11 @@ end:
 /*
  * Fill lttng_channel array of all channels.
  */
-static void list_lttng_channels(enum lttng_domain_type domain,
+static ssize_t list_lttng_channels(enum lttng_domain_type domain,
                struct ltt_session *session, struct lttng_channel *channels,
                struct lttng_channel_extended *chan_exts)
 {
-       int i = 0, ret;
+       int i = 0, ret = 0;
        struct ltt_kernel_channel *kchan;
 
        DBG("Listing channels for session %s", session->name);
@@ -322,6 +322,9 @@ static void list_lttng_channels(enum lttng_domain_type domain,
                                break;
                        }
 
+                       chan_exts[i].monitor_timer_interval =
+                                       uchan->monitor_timer_interval;
+
                        ret = get_ust_runtime_stats(session, uchan,
                                        &discarded_events, &lost_packets);
                        if (ret < 0) {
@@ -329,8 +332,6 @@ static void list_lttng_channels(enum lttng_domain_type domain,
                        }
                        chan_exts[i].discarded_events = discarded_events;
                        chan_exts[i].lost_packets = lost_packets;
-                       chan_exts[i].monitor_timer_interval =
-                                       uchan->monitor_timer_interval;
                        i++;
                }
                rcu_read_unlock();
@@ -341,7 +342,11 @@ static void list_lttng_channels(enum lttng_domain_type domain,
        }
 
 end:
-       return;
+       if (ret < 0) {
+               return -LTTNG_ERR_FATAL;
+       } else {
+               return LTTNG_OK;
+       }
 }
 
 static void increment_extended_len(const char *filter_expression,
@@ -2936,7 +2941,12 @@ ssize_t cmd_list_channels(enum lttng_domain_type domain,
 
                channel_exts = ((void *) *channels) +
                                (nb_chan * sizeof(struct lttng_channel));
-               list_lttng_channels(domain, session, *channels, channel_exts);
+               ret = list_lttng_channels(domain, session, *channels, channel_exts);
+               if (ret != LTTNG_OK) {
+                       free(*channels);
+                       *channels = NULL;
+                       goto end;
+               }
        } else {
                *channels = NULL;
        }
@@ -3587,7 +3597,10 @@ int cmd_register_trigger(struct command_ctx *cmd_ctx, int sock,
 
        ret = notification_thread_command_register_trigger(notification_thread,
                        trigger);
+       /* Ownership of trigger was transferred. */
+       trigger = NULL;
 end:
+       lttng_trigger_destroy(trigger);
        lttng_dynamic_buffer_reset(&trigger_buffer);
        return ret;
 }
@@ -3630,6 +3643,7 @@ int cmd_unregister_trigger(struct command_ctx *cmd_ctx, int sock,
        ret = notification_thread_command_unregister_trigger(notification_thread,
                        trigger);
 end:
+       lttng_trigger_destroy(trigger);
        lttng_dynamic_buffer_reset(&trigger_buffer);
        return ret;
 }
This page took 0.024332 seconds and 4 git commands to generate.