From 2d42927b2d81fbc88ef5e9587c6ae51143ec51ed Mon Sep 17 00:00:00 2001 From: Philippe Proulx Date: Tue, 19 Feb 2019 14:51:02 -0500 Subject: [PATCH] Fix: flt.utils.muxer: make sure message's default clock class exists 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 --- plugins/utils/muxer/muxer.c | 69 +++++++++++++++++++++++++++---------- 1 file changed, 51 insertions(+), 18 deletions(-) diff --git a/plugins/utils/muxer/muxer.c b/plugins/utils/muxer/muxer.c index 4b366972..607023b2 100644 --- a/plugins/utils/muxer/muxer.c +++ b/plugins/utils/muxer/muxer.c @@ -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; -- 2.34.1