Fix: flt.utils.muxer: make sure message's default clock class exists
authorPhilippe Proulx <eeppeliteloop@gmail.com>
Tue, 19 Feb 2019 19:51:02 +0000 (14:51 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 3 May 2019 22:19:38 +0000 (18:19 -0400)
Without the checks added by this patch, the iterator can borrow the
default clock snapshot of a message related to a stream class without
any default clock class. This is a precondition break.

If there's no default clock class, then we fall back to assuming this
message has the same time as the latest returned message's time.

Signed-off-by: Philippe Proulx <eeppeliteloop@gmail.com>
plugins/utils/muxer/muxer.c

index 4b3669726cd7c28f99bcccb24809e95fb27ca738..607023b2cd2dc9d9a501ab75eb534d4ec9db582d 100644 (file)
@@ -626,42 +626,81 @@ int get_msg_ts_ns(struct muxer_comp *muxer_comp,
 
        switch (bt_message_get_type(msg)) {
        case BT_MESSAGE_TYPE_EVENT:
+               clock_class =
+                       bt_message_event_borrow_stream_class_default_clock_class_const(
+                               msg);
+               if (!clock_class) {
+                       goto no_clock_snapshot;
+               }
+
                cs_state = bt_message_event_borrow_default_clock_snapshot_const(
                        msg, &clock_snapshot);
                break;
        case BT_MESSAGE_TYPE_PACKET_BEGINNING:
+               bt_message_packet_beginning_borrow_stream_class_default_clock_class_const(
+                       msg);
+               if (!clock_class) {
+                       goto no_clock_snapshot;
+               }
+
                cs_state = bt_message_packet_beginning_borrow_default_clock_snapshot_const(
                        msg, &clock_snapshot);
                break;
        case BT_MESSAGE_TYPE_PACKET_END:
+               bt_message_packet_end_borrow_stream_class_default_clock_class_const(
+                       msg);
+               if (!clock_class) {
+                       goto no_clock_snapshot;
+               }
+
                cs_state = bt_message_packet_end_borrow_default_clock_snapshot_const(
                        msg, &clock_snapshot);
                break;
        case BT_MESSAGE_TYPE_DISCARDED_EVENTS:
+               bt_message_discarded_events_borrow_stream_class_default_clock_class_const(
+                       msg);
+               if (!clock_class) {
+                       goto no_clock_snapshot;
+               }
+
                cs_state = bt_message_discarded_events_borrow_default_beginning_clock_snapshot_const(
                        msg, &clock_snapshot);
                break;
        case BT_MESSAGE_TYPE_DISCARDED_PACKETS:
+               bt_message_discarded_packets_borrow_stream_class_default_clock_class_const(
+                       msg);
+               if (!clock_class) {
+                       goto no_clock_snapshot;
+               }
+
                cs_state = bt_message_discarded_packets_borrow_default_beginning_clock_snapshot_const(
                        msg, &clock_snapshot);
                break;
        case BT_MESSAGE_TYPE_STREAM_ACTIVITY_BEGINNING:
+               bt_message_stream_activity_beginning_borrow_stream_class_default_clock_class_const(
+                       msg);
+               if (!clock_class) {
+                       goto no_clock_snapshot;
+               }
+
                sa_cs_state = bt_message_stream_activity_beginning_borrow_default_clock_snapshot_const(
                        msg, &clock_snapshot);
                if (sa_cs_state != BT_MESSAGE_STREAM_ACTIVITY_CLOCK_SNAPSHOT_STATE_KNOWN) {
-                       /* No timestamp: high priority */
-                       *ts_ns = last_returned_ts_ns;
-                       goto end;
+                       goto no_clock_snapshot;
                }
 
                break;
        case BT_MESSAGE_TYPE_STREAM_ACTIVITY_END:
+               bt_message_stream_activity_end_borrow_stream_class_default_clock_class_const(
+                       msg);
+               if (!clock_class) {
+                       goto no_clock_snapshot;
+               }
+
                sa_cs_state = bt_message_stream_activity_end_borrow_default_clock_snapshot_const(
                        msg, &clock_snapshot);
                if (sa_cs_state != BT_MESSAGE_STREAM_ACTIVITY_CLOCK_SNAPSHOT_STATE_KNOWN) {
-                       /* No timestamp: high priority */
-                       *ts_ns = last_returned_ts_ns;
-                       goto end;
+                       goto no_clock_snapshot;
                }
 
                break;
@@ -683,18 +722,6 @@ int get_msg_ts_ns(struct muxer_comp *muxer_comp,
                goto end;
        }
 
-       /*
-        * If the clock snapshot is missing, then we consider that this
-        * message has no time. In this case it's always the
-        * youngest.
-        */
-       if (!clock_snapshot) {
-               BT_LOGV_STR("Message's default clock snapshot is missing: "
-                       "using the last returned timestamp.");
-               *ts_ns = last_returned_ts_ns;
-               goto end;
-       }
-
        clock_class = bt_clock_snapshot_borrow_clock_class_const(clock_snapshot);
        BT_ASSERT(clock_class);
        cc_uuid = bt_clock_class_get_uuid(clock_class);
@@ -857,6 +884,12 @@ int get_msg_ts_ns(struct muxer_comp *muxer_comp,
 
        goto end;
 
+no_clock_snapshot:
+       BT_LOGV_STR("Message's default clock snapshot is missing: "
+               "using the last returned timestamp.");
+       *ts_ns = last_returned_ts_ns;
+       goto end;
+
 error:
        ret = -1;
 
This page took 0.026142 seconds and 4 git commands to generate.