Fix: sessiond: incorrect use of exclusions array leads to crash
[lttng-tools.git] / src / bin / lttng-sessiond / cmd.c
index 9552bbb8680f363477b2d56811196862f7e324c4..1adeeee4701d34e844f66d1217a716974a50b01a 100644 (file)
@@ -376,10 +376,13 @@ static enum lttng_error_code list_lttng_ust_global_events(char *channel_name,
        struct ltt_ust_event *uevent;
        unsigned long channel_event_count;
        unsigned int local_nb_events = 0;
+       struct lttng_dynamic_pointer_array exclusion_names;
 
        assert(reply_payload);
        assert(nb_events);
 
+       lttng_dynamic_pointer_array_init(&exclusion_names, NULL);
+
        DBG("Listing UST global events for channel %s", channel_name);
 
        rcu_read_lock();
@@ -388,7 +391,7 @@ static enum lttng_error_code list_lttng_ust_global_events(char *channel_name,
        node = lttng_ht_iter_get_node_str(&iter);
        if (node == NULL) {
                ret_code = LTTNG_ERR_UST_CHAN_NOT_FOUND;
-               goto end;
+               goto error;
        }
 
        uchan = caa_container_of(&node->node, struct ltt_ust_channel, node.node);
@@ -421,14 +424,14 @@ static enum lttng_error_code list_lttng_ust_global_events(char *channel_name,
                tmp_event = lttng_event_create();
                if (!tmp_event) {
                        ret_code = LTTNG_ERR_NOMEM;
-                       goto end;
+                       goto error;
                }
 
                if (lttng_strncpy(tmp_event->name, uevent->attr.name,
                                LTTNG_SYMBOL_NAME_LEN)) {
                        ret_code = LTTNG_ERR_FATAL;
                        lttng_event_destroy(tmp_event);
-                       goto end;
+                       goto error;
                }
 
                tmp_event->name[LTTNG_SYMBOL_NAME_LEN - 1] = '\0';
@@ -465,14 +468,34 @@ static enum lttng_error_code list_lttng_ust_global_events(char *channel_name,
                        tmp_event->exclusion = 1;
                }
 
+               if (uevent->exclusion) {
+                       int i;
+
+                       for (i = 0; i < uevent->exclusion->count; i++) {
+                               const int add_ret = lttng_dynamic_pointer_array_add_pointer(
+                                               &exclusion_names,
+                                               LTTNG_EVENT_EXCLUSION_NAME_AT(uevent->exclusion, i));
+
+                               if (add_ret) {
+                                       PERROR("Failed to add exclusion name to temporary serialization array");
+                                       ret_code = LTTNG_ERR_NOMEM;
+                                       goto error;
+                               }
+                       }
+               }
+
                /*
                 * We do not care about the filter bytecode and the fd from the
                 * userspace_probe_location.
                 */
-               ret = lttng_event_serialize(tmp_event, uevent->exclusion ? uevent->exclusion->count : 0,
-                               uevent->exclusion ? (char **) uevent->exclusion ->names : NULL,
-                               uevent->filter_expression, 0, NULL, reply_payload);
+               ret = lttng_event_serialize(tmp_event,
+                               lttng_dynamic_pointer_array_get_count(&exclusion_names),
+                               lttng_dynamic_pointer_array_get_count(&exclusion_names) ?
+                                               (char **) exclusion_names.array.buffer.data : NULL,
+                               uevent->filter_expression, 0, NULL,
+                               reply_payload);
                lttng_event_destroy(tmp_event);
+               lttng_dynamic_pointer_array_clear(&exclusion_names);
                if (ret) {
                        ret_code = LTTNG_ERR_FATAL;
                        goto error;
@@ -484,6 +507,7 @@ end:
        ret_code = LTTNG_OK;
        *nb_events = local_nb_events;
 error:
+       lttng_dynamic_pointer_array_reset(&exclusion_names);
        rcu_read_unlock();
        return ret_code;
 }
@@ -1292,7 +1316,7 @@ static int cmd_enable_channel_internal(struct ltt_session *session,
 
        attr = lttng_channel_copy(_attr);
        if (!attr) {
-               ret = -LTTNG_ERR_NOMEM;
+               ret = LTTNG_ERR_NOMEM;
                goto end;
        }
 
@@ -2819,7 +2843,7 @@ int cmd_start_trace(struct ltt_session *session)
         */
        session->rotated_after_last_stop = false;
 
-       if (session->rotate_timer_period) {
+       if (session->rotate_timer_period && !session->rotation_schedule_timer_enabled) {
                int int_ret = timer_session_rotation_schedule_timer_start(
                                session, session->rotate_timer_period);
 
@@ -3766,8 +3790,8 @@ enum lttng_error_code cmd_list_channels(enum lttng_domain_type domain,
 
                        channel = trace_ust_channel_to_lttng_channel(uchan);
                        if (!channel) {
-                               ret = LTTNG_ERR_NOMEM;
-                               break;
+                               ret_code = LTTNG_ERR_NOMEM;
+                               goto end;
                        }
 
                        extended = (struct lttng_channel_extended *)
@@ -3778,7 +3802,7 @@ enum lttng_error_code cmd_list_channels(enum lttng_domain_type domain,
                        if (ret < 0) {
                                lttng_channel_destroy(channel);
                                ret_code = LTTNG_ERR_UNK;
-                               break;
+                               goto end;
                        }
 
                        extended->discarded_events = discarded_events;
@@ -3789,11 +3813,12 @@ enum lttng_error_code cmd_list_channels(enum lttng_domain_type domain,
                        if (ret) {
                                ERR("Failed to serialize lttng_channel: channel name = '%s'",
                                                channel->name);
+                               lttng_channel_destroy(channel);
                                ret_code = LTTNG_ERR_UNK;
-                               ret = -1;
-                               break;
+                               goto end;
                        }
 
+                       lttng_channel_destroy(channel);
                        i++;
                }
                rcu_read_unlock();
@@ -4518,6 +4543,8 @@ enum lttng_error_code synchronize_tracer_notifier_register(
                                                (int) trigger_owner,
                                                ret_code);
                        }
+
+                       goto end_unlock_session_list;
                }
                break;
        }
This page took 0.024684 seconds and 4 git commands to generate.