discoverer: Make sure the missing elements details array is NULL-terminated in a...
authorSebastian Dröge <sebastian@centricular.com>
Tue, 26 Nov 2024 13:41:24 +0000 (15:41 +0200)
committerGStreamer Marge Bot <gitlab-merge-bot@gstreamer-foundation.org>
Thu, 28 Nov 2024 07:53:15 +0000 (07:53 +0000)
And also avoid a possible out-of-bounds read if the array contains no elements.

Part-of: <https://gitlab.freedesktop.org/gstreamer/gstreamer/-/merge_requests/7986>

subprojects/gst-plugins-base/gst-libs/gst/pbutils/gstdiscoverer-types.c
subprojects/gst-plugins-base/gst-libs/gst/pbutils/gstdiscoverer.c

index dc76657a98d867b5e7b839b509fbe5891525e0cb..55172388eb8ae6078be56850b1e5c2d8a17632cb 100644 (file)
@@ -365,7 +365,12 @@ G_DEFINE_TYPE (GstDiscovererInfo, gst_discoverer_info, G_TYPE_OBJECT);
 static void
 gst_discoverer_info_init (GstDiscovererInfo * info)
 {
+#if GLIB_CHECK_VERSION(2,74,0)
+  info->missing_elements_details =
+      g_ptr_array_new_null_terminated (16, g_free, TRUE);
+#else
   info->missing_elements_details = g_ptr_array_new_with_free_func (g_free);
+#endif
 }
 
 static void
@@ -1179,7 +1184,6 @@ const gchar **
 gst_discoverer_info_get_missing_elements_installer_details (const
     GstDiscovererInfo * info)
 {
-
   if (info->result != GST_DISCOVERER_MISSING_PLUGINS) {
     GST_WARNING_OBJECT (info, "Trying to get missing element installed details "
         "but result is not 'MISSING_PLUGINS'");
@@ -1187,11 +1191,5 @@ gst_discoverer_info_get_missing_elements_installer_details (const
     return NULL;
   }
 
-  if (info->missing_elements_details->pdata[info->missing_elements_details->
-          len]) {
-    GST_DEBUG ("Adding NULL pointer to the end of missing_elements_details");
-    g_ptr_array_add (info->missing_elements_details, NULL);
-  }
-
   return (const gchar **) info->missing_elements_details->pdata;
 }
index 5e72e797cb13c08e1bd19e037e8a889ffe6672d4..398dca35e0e3f2492f344a75bbcf5dcd0f1bae18 100644 (file)
@@ -1535,6 +1535,10 @@ discoverer_collect (GstDiscoverer * dc)
         g_variant_get_data (variant), g_variant_get_size (variant), NULL);
     g_variant_unref (variant);
   }
+#if !GLIB_CHECK_VERSION(2,74,0)
+  /* Make sure the missing element details are NULL-terminated */
+  g_ptr_array_add (dc->priv->current_info->missing_elements_details, NULL);
+#endif
 
   if (dc->priv->async)
     emit_discovered (dc);