Blame SOURCES/0001-mxfdemux-Store-GstMXFDemuxEssenceTrack-in-their-own-.patch

0b3edb
From 57bf1de1d515866398292907398355bba53fcf31 Mon Sep 17 00:00:00 2001
0b3edb
From: Wim Taymans <wtaymans@redhat.com>
0b3edb
Date: Wed, 13 Dec 2023 16:11:33 +0100
0b3edb
Subject: [PATCH] mxfdemux: Store GstMXFDemuxEssenceTrack in their own fixed
0b3edb
 allocation
0b3edb
0b3edb
Previously they were stored inline inside a GArray, but as references to
0b3edb
the tracks were stored in various other places although the array could
0b3edb
still be updated (and reallocated!), this could lead to dangling
0b3edb
references in various places.
0b3edb
0b3edb
Instead now store them in a GPtrArray in their own allocation so each
0b3edb
track's memory position stays fixed.
0b3edb
0b3edb
Fixes ZDI-CAN-22299
0b3edb
0b3edb
Fixes https://gitlab.freedesktop.org/gstreamer/gstreamer/-/issues/3055
0b3edb
0b3edb
Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/5638>
0b3edb
---
0b3edb
 gst/mxf/mxfdemux.c | 105 ++++++++++++++++++++-------------------------
0b3edb
 gst/mxf/mxfdemux.h |   2 +-
0b3edb
 2 files changed, 48 insertions(+), 59 deletions(-)
0b3edb
0b3edb
diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c
0b3edb
index 13ab13b60..5428873ee 100644
0b3edb
--- a/gst/mxf/mxfdemux.c
0b3edb
+++ b/gst/mxf/mxfdemux.c
0b3edb
@@ -144,10 +144,25 @@ gst_mxf_demux_partition_free (GstMXFDemuxPartition * partition)
0b3edb
 }
0b3edb
 
0b3edb
 static void
0b3edb
-gst_mxf_demux_reset_mxf_state (GstMXFDemux * demux)
0b3edb
+gst_mxf_demux_essence_track_free (GstMXFDemuxEssenceTrack * t)
0b3edb
 {
0b3edb
-  guint i;
0b3edb
+  if (t->offsets)
0b3edb
+    g_array_free (t->offsets, TRUE);
0b3edb
+
0b3edb
+  g_free (t->mapping_data);
0b3edb
+
0b3edb
+  if (t->tags)
0b3edb
+    gst_tag_list_unref (t->tags);
0b3edb
+
0b3edb
+  if (t->caps)
0b3edb
+    gst_caps_unref (t->caps);
0b3edb
+
0b3edb
+  g_free (t);
0b3edb
+}
0b3edb
 
0b3edb
+static void
0b3edb
+gst_mxf_demux_reset_mxf_state (GstMXFDemux * demux)
0b3edb
+{
0b3edb
   GST_DEBUG_OBJECT (demux, "Resetting MXF state");
0b3edb
 
0b3edb
   g_list_foreach (demux->partitions, (GFunc) gst_mxf_demux_partition_free,
0b3edb
@@ -157,22 +172,7 @@ gst_mxf_demux_reset_mxf_state (GstMXFDemux * demux)
0b3edb
 
0b3edb
   demux->current_partition = NULL;
0b3edb
 
0b3edb
-  for (i = 0; i < demux->essence_tracks->len; i++) {
0b3edb
-    GstMXFDemuxEssenceTrack *t =
0b3edb
-        &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i);
0b3edb
-
0b3edb
-    if (t->offsets)
0b3edb
-      g_array_free (t->offsets, TRUE);
0b3edb
-
0b3edb
-    g_free (t->mapping_data);
0b3edb
-
0b3edb
-    if (t->tags)
0b3edb
-      gst_tag_list_free (t->tags);
0b3edb
-
0b3edb
-    if (t->caps)
0b3edb
-      gst_caps_unref (t->caps);
0b3edb
-  }
0b3edb
-  g_array_set_size (demux->essence_tracks, 0);
0b3edb
+  g_ptr_array_set_size (demux->essence_tracks, 0);
0b3edb
 }
0b3edb
 
0b3edb
 static void
0b3edb
@@ -190,7 +190,7 @@ gst_mxf_demux_reset_linked_metadata (GstMXFDemux * demux)
0b3edb
 
0b3edb
   for (i = 0; i < demux->essence_tracks->len; i++) {
0b3edb
     GstMXFDemuxEssenceTrack *track =
0b3edb
-        &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i);
0b3edb
+        g_ptr_array_index (demux->essence_tracks, i);
0b3edb
 
0b3edb
     track->source_package = NULL;
0b3edb
     track->source_track = NULL;
0b3edb
@@ -698,8 +698,7 @@ gst_mxf_demux_update_essence_tracks (GstMXFDemux * demux)
0b3edb
 
0b3edb
       for (k = 0; k < demux->essence_tracks->len; k++) {
0b3edb
         GstMXFDemuxEssenceTrack *tmp =
0b3edb
-            &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack,
0b3edb
-            k);
0b3edb
+            g_ptr_array_index (demux->essence_tracks, k);
0b3edb
 
0b3edb
         if (tmp->track_number == track->parent.track_number &&
0b3edb
             tmp->body_sid == edata->body_sid) {
0b3edb
@@ -717,23 +716,22 @@ gst_mxf_demux_update_essence_tracks (GstMXFDemux * demux)
0b3edb
       }
0b3edb
 
0b3edb
       if (!etrack) {
0b3edb
-        GstMXFDemuxEssenceTrack tmp;
0b3edb
+        GstMXFDemuxEssenceTrack *tmp = g_new0 (GstMXFDemuxEssenceTrack, 1);
0b3edb
 
0b3edb
-        memset (&tmp, 0, sizeof (tmp));
0b3edb
-        tmp.body_sid = edata->body_sid;
0b3edb
-        tmp.track_number = track->parent.track_number;
0b3edb
-        tmp.track_id = track->parent.track_id;
0b3edb
-        memcpy (&tmp.source_package_uid, &package->parent.package_uid, 32);
0b3edb
+        tmp->body_sid = edata->body_sid;
0b3edb
+        tmp->track_number = track->parent.track_number;
0b3edb
+        tmp->track_id = track->parent.track_id;
0b3edb
+        memcpy (&tmp->source_package_uid, &package->parent.package_uid, 32);
0b3edb
 
0b3edb
         if (demux->current_partition->partition.body_sid == edata->body_sid &&
0b3edb
             demux->current_partition->partition.body_offset == 0)
0b3edb
-          tmp.position = 0;
0b3edb
+          tmp->position = 0;
0b3edb
         else
0b3edb
-          tmp.position = -1;
0b3edb
+          tmp->position = -1;
0b3edb
 
0b3edb
-        g_array_append_val (demux->essence_tracks, tmp);
0b3edb
+        g_ptr_array_add (demux->essence_tracks, tmp);
0b3edb
         etrack =
0b3edb
-            &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack,
0b3edb
+            g_ptr_array_index (demux->essence_tracks,
0b3edb
             demux->essence_tracks->len - 1);
0b3edb
         new = TRUE;
0b3edb
       }
0b3edb
@@ -843,13 +841,7 @@ gst_mxf_demux_update_essence_tracks (GstMXFDemux * demux)
0b3edb
 
0b3edb
     next:
0b3edb
       if (new) {
0b3edb
-        g_free (etrack->mapping_data);
0b3edb
-        if (etrack->tags)
0b3edb
-          gst_tag_list_free (etrack->tags);
0b3edb
-        if (etrack->caps)
0b3edb
-          gst_caps_unref (etrack->caps);
0b3edb
-
0b3edb
-        g_array_remove_index (demux->essence_tracks,
0b3edb
+        g_ptr_array_remove_index (demux->essence_tracks,
0b3edb
             demux->essence_tracks->len - 1);
0b3edb
       }
0b3edb
     }
0b3edb
@@ -862,7 +854,7 @@ gst_mxf_demux_update_essence_tracks (GstMXFDemux * demux)
0b3edb
 
0b3edb
   for (i = 0; i < demux->essence_tracks->len; i++) {
0b3edb
     GstMXFDemuxEssenceTrack *etrack =
0b3edb
-        &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i);
0b3edb
+        g_ptr_array_index (demux->essence_tracks, i);
0b3edb
 
0b3edb
     if (!etrack->source_package || !etrack->source_track || !etrack->caps) {
0b3edb
       GST_ERROR_OBJECT (demux, "Failed to update essence track %u", i);
0b3edb
@@ -1018,7 +1010,7 @@ gst_mxf_demux_update_tracks (GstMXFDemux * demux)
0b3edb
 
0b3edb
     for (k = 0; k < demux->essence_tracks->len; k++) {
0b3edb
       GstMXFDemuxEssenceTrack *tmp =
0b3edb
-          &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, k);
0b3edb
+          g_ptr_array_index (demux->essence_tracks, k);
0b3edb
 
0b3edb
       if (tmp->source_package == source_package &&
0b3edb
           tmp->source_track == source_track) {
0b3edb
@@ -1456,7 +1448,7 @@ gst_mxf_demux_pad_set_component (GstMXFDemux * demux, GstMXFDemuxPad * pad,
0b3edb
 
0b3edb
   for (k = 0; k < demux->essence_tracks->len; k++) {
0b3edb
     GstMXFDemuxEssenceTrack *tmp =
0b3edb
-        &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, k);
0b3edb
+        g_ptr_array_index (demux->essence_tracks, k);
0b3edb
 
0b3edb
     if (tmp->source_package == source_package &&
0b3edb
         tmp->source_track == source_track) {
0b3edb
@@ -1576,7 +1568,7 @@ gst_mxf_demux_handle_generic_container_essence_element (GstMXFDemux * demux,
0b3edb
 
0b3edb
   for (i = 0; i < demux->essence_tracks->len; i++) {
0b3edb
     GstMXFDemuxEssenceTrack *tmp =
0b3edb
-        &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i);
0b3edb
+        g_ptr_array_index (demux->essence_tracks, i);
0b3edb
 
0b3edb
     if (tmp->body_sid == demux->current_partition->partition.body_sid &&
0b3edb
         (tmp->track_number == track_number || tmp->track_number == 0)) {
0b3edb
@@ -2288,7 +2280,7 @@ gst_mxf_demux_handle_klv_packet (GstMXFDemux * demux, const MXFUL * key,
0b3edb
 
0b3edb
       for (i = 0; i < demux->essence_tracks->len; i++) {
0b3edb
         GstMXFDemuxEssenceTrack *etrack =
0b3edb
-            &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i);
0b3edb
+            g_ptr_array_index (demux->essence_tracks, i);
0b3edb
 
0b3edb
         if (etrack->body_sid != demux->current_partition->partition.body_sid)
0b3edb
           continue;
0b3edb
@@ -2343,7 +2335,7 @@ gst_mxf_demux_handle_klv_packet (GstMXFDemux * demux, const MXFUL * key,
0b3edb
       guint i;
0b3edb
       for (i = 0; i < demux->essence_tracks->len; i++) {
0b3edb
         GstMXFDemuxEssenceTrack *etrack =
0b3edb
-            &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i);
0b3edb
+            g_ptr_array_index (demux->essence_tracks, i);
0b3edb
 
0b3edb
         if (etrack->body_sid != demux->current_partition->partition.body_sid)
0b3edb
           continue;
0b3edb
@@ -2466,7 +2458,7 @@ from_index:
0b3edb
 
0b3edb
     for (i = 0; i < demux->essence_tracks->len; i++) {
0b3edb
       GstMXFDemuxEssenceTrack *t =
0b3edb
-          &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i);
0b3edb
+          g_ptr_array_index (demux->essence_tracks, i);
0b3edb
 
0b3edb
       t->position = (demux->offset == demux->run_in) ? 0 : -1;
0b3edb
     }
0b3edb
@@ -2486,8 +2478,7 @@ from_index:
0b3edb
       if (ret == GST_FLOW_UNEXPECTED) {
0b3edb
         for (i = 0; i < demux->essence_tracks->len; i++) {
0b3edb
           GstMXFDemuxEssenceTrack *t =
0b3edb
-              &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack,
0b3edb
-              i);
0b3edb
+              g_ptr_array_index (demux->essence_tracks, i);
0b3edb
 
0b3edb
           if (t->position > 0)
0b3edb
             t->duration = t->position;
0b3edb
@@ -2569,7 +2560,7 @@ gst_mxf_demux_pull_and_handle_klv_packet (GstMXFDemux * demux)
0b3edb
 
0b3edb
     for (i = 0; i < demux->essence_tracks->len; i++) {
0b3edb
       GstMXFDemuxEssenceTrack *t =
0b3edb
-          &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i);
0b3edb
+          g_ptr_array_index (demux->essence_tracks, i);
0b3edb
 
0b3edb
       if (t->position > 0)
0b3edb
         t->duration = t->position;
0b3edb
@@ -3149,7 +3140,7 @@ gst_mxf_demux_seek_push (GstMXFDemux * demux, GstEvent * event)
0b3edb
 
0b3edb
   for (i = 0; i < demux->essence_tracks->len; i++) {
0b3edb
     GstMXFDemuxEssenceTrack *t =
0b3edb
-        &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i);
0b3edb
+        g_ptr_array_index (demux->essence_tracks, i);
0b3edb
     t->position = -1;
0b3edb
   }
0b3edb
 
0b3edb
@@ -3347,7 +3338,7 @@ gst_mxf_demux_seek_pull (GstMXFDemux * demux, GstEvent * event)
0b3edb
 
0b3edb
   for (i = 0; i < demux->essence_tracks->len; i++) {
0b3edb
     GstMXFDemuxEssenceTrack *t =
0b3edb
-        &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i);
0b3edb
+        g_ptr_array_index (demux->essence_tracks, i);
0b3edb
     t->position = -1;
0b3edb
   }
0b3edb
 
0b3edb
@@ -3623,7 +3614,7 @@ gst_mxf_demux_sink_event (GstPad * pad, GstEvent * event)
0b3edb
 
0b3edb
       for (i = 0; i < demux->essence_tracks->len; i++) {
0b3edb
         GstMXFDemuxEssenceTrack *t =
0b3edb
-            &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i);
0b3edb
+            g_ptr_array_index (demux->essence_tracks, i);
0b3edb
 
0b3edb
         if (t->position > 0)
0b3edb
           t->duration = t->position;
0b3edb
@@ -3664,8 +3655,7 @@ gst_mxf_demux_sink_event (GstPad * pad, GstEvent * event)
0b3edb
 
0b3edb
           for (i = 0; i < demux->essence_tracks->len; i++) {
0b3edb
             GstMXFDemuxEssenceTrack *etrack =
0b3edb
-                &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack,
0b3edb
-                i);
0b3edb
+                g_ptr_array_index (demux->essence_tracks, i);
0b3edb
             etrack->position = -1;
0b3edb
           }
0b3edb
           ret = TRUE;
0b3edb
@@ -3685,8 +3675,7 @@ gst_mxf_demux_sink_event (GstPad * pad, GstEvent * event)
0b3edb
 
0b3edb
       for (i = 0; i < demux->essence_tracks->len; i++) {
0b3edb
         GstMXFDemuxEssenceTrack *t =
0b3edb
-            &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack,
0b3edb
-            i);
0b3edb
+            g_ptr_array_index (demux->essence_tracks, i);
0b3edb
         t->position = -1;
0b3edb
       }
0b3edb
       demux->current_partition = NULL;
0b3edb
@@ -3947,7 +3936,7 @@ gst_mxf_demux_finalize (GObject * object)
0b3edb
 
0b3edb
   g_ptr_array_free (demux->src, TRUE);
0b3edb
   demux->src = NULL;
0b3edb
-  g_array_free (demux->essence_tracks, TRUE);
0b3edb
+  g_ptr_array_free (demux->essence_tracks, TRUE);
0b3edb
   demux->essence_tracks = NULL;
0b3edb
 
0b3edb
   g_hash_table_destroy (demux->metadata);
0b3edb
@@ -4031,8 +4020,8 @@ gst_mxf_demux_init (GstMXFDemux * demux, GstMXFDemuxClass * g_class)
0b3edb
   g_static_rw_lock_init (&demux->metadata_lock);
0b3edb
 
0b3edb
   demux->src = g_ptr_array_new ();
0b3edb
-  demux->essence_tracks =
0b3edb
-      g_array_new (FALSE, FALSE, sizeof (GstMXFDemuxEssenceTrack));
0b3edb
+  demux->essence_tracks = g_ptr_array_new_with_free_func ((GDestroyNotify)
0b3edb
+      gst_mxf_demux_essence_track_free);
0b3edb
 
0b3edb
   gst_segment_init (&demux->segment, GST_FORMAT_TIME);
0b3edb
 
0b3edb
diff --git a/gst/mxf/mxfdemux.h b/gst/mxf/mxfdemux.h
0b3edb
index e8b90261e..b88b3da58 100644
0b3edb
--- a/gst/mxf/mxfdemux.h
0b3edb
+++ b/gst/mxf/mxfdemux.h
0b3edb
@@ -148,7 +148,7 @@ struct _GstMXFDemux
0b3edb
   GList *partitions;
0b3edb
   GstMXFDemuxPartition *current_partition;
0b3edb
 
0b3edb
-  GArray *essence_tracks;
0b3edb
+  GPtrArray *essence_tracks;
0b3edb
   GList *pending_index_table_segments;
0b3edb
 
0b3edb
   GArray *random_index_pack;
0b3edb
-- 
0b3edb
2.43.0
0b3edb